reqlog/main.go

57 lines
1.1 KiB
Go

package main
import (
"flag"
"fmt"
"net/http"
"net/http/httputil"
"os"
"strings"
"time"
)
var logFile *string
func main() {
logFile = flag.String("logfile", "requests.log", "the file to log requests to")
flag.Parse()
http.HandleFunc("/", post)
err := http.ListenAndServe(":8080", nil)
if err != nil {
panic(err)
}
}
func post(w http.ResponseWriter, r *http.Request) {
reqDump, err := httputil.DumpRequest(r, true)
if err != nil {
w.WriteHeader(500)
w.Write([]byte(err.Error()))
return
}
// log to stdout
fmt.Print(logString(reqDump))
// log to logfile
lf, err := os.OpenFile(*logFile, os.O_CREATE | os.O_APPEND | os.O_WRONLY, 0644)
if err != nil {
fmt.Printf("failed to open log file: %v", err)
w.WriteHeader(500)
w.Write([]byte(fmt.Sprintf("failed to open log file: %v", err)))
}
defer lf.Close()
lf.WriteString(logString(reqDump))
// echo log message as response
w.WriteHeader(200)
w.Write([]byte(logString(reqDump)))
}
func logString(reqDump []byte) string {
var sb strings.Builder
sb.WriteString(fmt.Sprintf("Received request at %v:\n\n", time.Now()))
sb.Write(reqDump)
sb.WriteString("\n\n")
return sb.String()
}