centralize logging

This commit is contained in:
iacore
2024-08-28 11:56:25 +00:00
committed by VnPower
parent 5137bf09c2
commit b7b599f1dd
5 changed files with 92 additions and 90 deletions
+88
View File
@@ -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
}
-27
View File
@@ -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)
}
}
-59
View File
@@ -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
}
+2 -2
View File
@@ -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)
}
+2 -2
View File
@@ -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),
})
}