mirror of
https://codeberg.org/VnPower/PixivFE
synced 2024-12-06 19:16:23 +01:00
centralize logging
This commit is contained in:
@@ -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
|
||||
}
|
||||
@@ -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)
|
||||
}
|
||||
}
|
||||
@@ -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
@@ -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
@@ -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),
|
||||
})
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user