nf/middleware.go

74 lines
1.4 KiB
Go
Raw Normal View History

2024-01-12 19:18:33 +08:00
package nf
import (
"fmt"
2024-06-07 17:39:06 +08:00
"github.com/google/uuid"
"github.com/loveuer/nf/nft/log"
2024-01-12 19:18:33 +08:00
"os"
"runtime/debug"
2024-06-07 17:39:06 +08:00
"strings"
2024-01-14 19:10:05 +08:00
"time"
2024-01-12 19:18:33 +08:00
)
func NewRecover(enableStackTrace bool) HandlerFunc {
return func(c *Ctx) error {
defer func() {
if r := recover(); r != nil {
if enableStackTrace {
os.Stderr.WriteString(fmt.Sprintf("recovered from panic: %v\n%s\n", r, debug.Stack()))
} else {
os.Stderr.WriteString(fmt.Sprintf("recovered from panic: %v\n", r))
}
2024-02-20 15:34:00 +08:00
//serveError(c, 500, []byte(fmt.Sprint(r)))
_ = c.Status(500).SendString(fmt.Sprint(r))
2024-01-12 19:18:33 +08:00
}
}()
return c.Next()
}
}
2024-01-14 19:10:05 +08:00
2024-06-07 17:39:06 +08:00
func NewLogger(traceHeader ...string) HandlerFunc {
Header := "X-Trace-ID"
if len(traceHeader) > 0 && traceHeader[0] != "" {
Header = traceHeader[0]
}
2024-01-14 19:10:05 +08:00
2024-06-07 17:39:06 +08:00
return func(c *Ctx) error {
2024-01-14 19:10:05 +08:00
var (
2024-06-07 17:39:06 +08:00
now = time.Now()
trace = c.Get(Header)
logFn func(msg string, data ...any)
ip = c.IP()
2024-01-14 19:10:05 +08:00
)
2024-06-07 17:39:06 +08:00
if trace == "" {
trace = uuid.Must(uuid.NewV7()).String()
2024-01-14 19:10:05 +08:00
}
2024-06-07 17:39:06 +08:00
c.SetHeader(Header, trace)
2024-01-14 19:10:05 +08:00
2024-06-07 17:39:06 +08:00
traces := strings.Split(trace, "-")
shortTrace := traces[len(traces)-1]
2024-01-14 19:10:05 +08:00
err := c.Next()
2024-06-07 17:39:06 +08:00
duration := time.Since(now)
2024-01-14 19:10:05 +08:00
2024-06-07 17:39:06 +08:00
msg := fmt.Sprintf("NF | %s | %15s | %3d | %s | %6s | %s", shortTrace, ip, c.StatusCode, HumanDuration(duration.Nanoseconds()), c.Method(), c.Path())
2024-01-14 19:10:05 +08:00
2024-06-07 17:39:06 +08:00
switch {
case c.StatusCode >= 500:
logFn = log.Error
case c.StatusCode >= 400:
logFn = log.Warn
default:
logFn = log.Info
}
logFn(msg)
2024-01-14 19:10:05 +08:00
return err
}
}