2024-12-19 15:03:36 +08:00

72 lines
1.3 KiB
Go

package logger
import (
"fmt"
"strconv"
"time"
"esway/internal/opt"
"esway/internal/tool"
"github.com/loveuer/esgo2dump/log"
"github.com/loveuer/nf"
"github.com/loveuer/nf/nft/resp"
)
type Config struct {
IgnoreFn func(c *nf.Ctx) bool
}
var defaultConfig = Config{
IgnoreFn: func(c *nf.Ctx) bool { return false },
}
func New(configs ...Config) nf.HandlerFunc {
return func(c *nf.Ctx) error {
var (
now = time.Now()
logFn func(msg string, data ...any)
ip = c.IP()
cfg Config
)
if len(configs) > 0 {
cfg = configs[0]
}
if cfg.IgnoreFn == nil {
cfg.IgnoreFn = defaultConfig.IgnoreFn
}
traceId := c.Context().Value(nf.TraceKey)
c.Locals(nf.TraceKey, traceId)
err := c.Next()
c.Writer.Header().Set(nf.TraceKey, fmt.Sprint(traceId))
c.Writer.Header().Add("X-NF-Module", opt.Cfg.Name)
if cfg.IgnoreFn(c) {
return err
}
status, _ := strconv.Atoi(c.Writer.Header().Get(resp.RealStatusHeader))
duration := time.Since(now)
msg := fmt.Sprintf("%s | %15s | %d[%3d] | %s | %6s | %s", traceId, ip, c.StatusCode, status, tool.HumanDuration(duration.Nanoseconds()), c.Method(), c.Path())
switch {
case status >= 500:
logFn = log.Error
case status >= 400:
logFn = log.Warn
default:
logFn = log.Info
}
logFn(msg)
return err
}
}