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 } }