diff --git a/audit/logging.go b/audit/logging.go new file mode 100644 index 0000000..ab6af47 --- /dev/null +++ b/audit/logging.go @@ -0,0 +1,88 @@ +package audit + +import ( + "fmt" + "log" + "net/http" + "os" + "path" + "time" + + config "codeberg.org/vnpower/pixivfe/v2/config" +) + +const DevDir_Response = "/tmp/pixivfe-dev/resp" + +var optionSaveResponse bool + +func Init(saveResponse bool) error { + optionSaveResponse = saveResponse + if optionSaveResponse { + return os.MkdirAll(DevDir_Response, 0o700) + } else { + return nil + } +} + +type ServerPerformance struct { + StartTime time.Time + EndTime time.Time + RemoteAddr string + Method string + Path string + Status int + Error error + SkipLogging bool +} + +type APIPerformance struct { + StartTime time.Time + EndTime time.Time + Response *http.Response + Error error + Method string + Url string + Token string + Body string + ResponseFilename string +} + +func LogServerRoundTrip(perf ServerPerformance) { + if perf.Error != nil { + log.Printf("Internal Server Error: %s", perf.Error) + } + + if !perf.SkipLogging { + // todo: log.Printf("%v +%v %v %v %v %v %v", time, latency, ip, method, path, status, err) + } +} + +func LogAPIRoundTrip(perf APIPerformance) { + if perf.Response != nil { + if perf.Body != "" && optionSaveResponse { + var err error + perf.ResponseFilename, err = writeResponseBodyToFile(perf.Body) + if err != nil { + log.Println("When saving response to file: ", err) + } + } + if !(300 > perf.Response.StatusCode && perf.Response.StatusCode >= 200) { + log.Println("(WARN) non-2xx response from pixiv:") + } + } + // structured logging + if config.GlobalServerConfig.InDevelopment { + // todo + } else { + // todo + } +} + +func writeResponseBodyToFile(body string) (string, error) { + filename := path.Join(DevDir_Response, time.Now().UTC().Format(time.RFC3339Nano)) + err := os.WriteFile(filename, []byte(body), 0o600) + if err != nil { + return "", err + } + return filename, nil +} diff --git a/audit/trace_route.go b/audit/trace_route.go deleted file mode 100644 index 1d15d92..0000000 --- a/audit/trace_route.go +++ /dev/null @@ -1,27 +0,0 @@ -package audit - -import ( - "log" - "time" -) - -type RoutePerf struct { - StartTime time.Time - EndTime time.Time - RemoteAddr string - Method string - Path string - Status int - Err error - SkipLogging bool -} - -func TraceRoute(data RoutePerf) { - if data.Err != nil { - log.Printf("Internal Server Error: %s", data.Err) - } - - if !data.SkipLogging { - // todo: log.Printf("%v +%v %v %v %v %v %v", time, latency, ip, method, path, status, err) - } -} diff --git a/audit/trace_webapi.go b/audit/trace_webapi.go deleted file mode 100644 index c72d324..0000000 --- a/audit/trace_webapi.go +++ /dev/null @@ -1,59 +0,0 @@ -package audit - -import ( - "fmt" - "log" - "net/http" - "os" - "path" - "time" - - config "codeberg.org/vnpower/pixivfe/v2/config" -) - -const DevDir_Response = "/tmp/pixivfe-dev/resp" - -var optionSaveResponse bool - -func Init(saveResponse bool) error { - optionSaveResponse = saveResponse - if optionSaveResponse { - return os.MkdirAll(DevDir_Response, 0o700) - } else { - return nil - } -} - -func LogAPIRoundTrip(resp *http.Response, err error, method, url, token, body string, start_time, end_time time.Time) { - if config.GlobalServerConfig.InDevelopment { - errs := "" - if err != nil { - errs = fmt.Sprintf("ERR %v", err) - } - if resp != nil { - filename := "" - if body != "" && optionSaveResponse { - var err error - filename, err = writeResponseBodyToFile(body) - if err != nil { - log.Println(err) - } - } - if !(300 > resp.StatusCode && resp.StatusCode >= 200) { - log.Println("(WARN) non-2xx response from pixiv:") - } - log.Println("->", method, url, "->", resp.StatusCode, filename, errs) - } else { - log.Println("->", method, url, errs) - } - } -} - -func writeResponseBodyToFile(body string) (string, error) { - filename := path.Join(DevDir_Response, time.Now().UTC().Format(time.RFC3339Nano)) - err := os.WriteFile(filename, []byte(body), 0o600) - if err != nil { - return "", err - } - return filename, nil -} diff --git a/core/requests.go b/core/requests.go index 3e285f3..7831f38 100644 --- a/core/requests.go +++ b/core/requests.go @@ -25,7 +25,7 @@ func API_GET(context context.Context, url string, token string) (SimpleHTTPRespo start_time := time.Now() res, resp, err := _API_GET(context, url, token) end_time := time.Now() - audit.LogAPIRoundTrip(resp, err, "GET", url, token, res.Body, start_time, end_time) + audit.LogAPIRoundTrip(audit.APIPerformance{resp, err, "GET", url, token, res.Body, start_time, end_time}) if err != nil { return SimpleHTTPResponse{}, fmt.Errorf("While GET %s: %w", url, err) } @@ -102,7 +102,7 @@ func API_POST(r *http.Request, url, payload, token, csrf string, isJSON bool) er start_time := time.Now() resp, err := _API_POST(r, url, payload, token, csrf, isJSON) end_time := time.Now() - audit.LogAPIRoundTrip(resp, err, "POST", url, token, "", start_time, end_time) + audit.LogAPIRoundTrip(audit.APIPerformance{Response: resp, Error: err, Method: "POST", Url: url, Token: token, Body: "", StartTime: start_time, EndTime: end_time}) if err != nil { return fmt.Errorf("While POST %s: %w", url, err) } diff --git a/handlers/logger.go b/handlers/logger.go index d6f3652..e7eaf6f 100644 --- a/handlers/logger.go +++ b/handlers/logger.go @@ -44,14 +44,14 @@ func LogRequest(f func(w http.ResponseWriter, r *http.Request)) func(w http.Resp end_time := time.Now() - audit.TraceRoute(audit.RoutePerf{ + audit.LogServerRoundTrip(audit.ServerPerformance{ StartTime: start_time, EndTime: end_time, RemoteAddr: r.RemoteAddr, Method: r.Method, Path: r.URL.Path, Status: w.statusCode, - Err: GetUserContext(r).Err, + Error: GetUserContext(r).Err, SkipLogging: CanRequestSkipLogger(r), }) }