go项目脚手架
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
sorbet/internal/runtime/server_logger.go

65 lines
1.5 KiB

package runtime
import (
"context"
"fmt"
"github.com/labstack/echo/v4"
"github.com/rs/xid"
"net/http"
"sorbet/internal/util"
"sorbet/pkg/log"
"time"
)
var color = log.NewColorer()
func requestId(req *http.Request, res *echo.Response) string {
id := req.Header.Get(echo.HeaderXRequestID)
if id == "" {
id = xid.New().String()
res.Header().Set(echo.HeaderXRequestID, id)
}
return id
}
// Logger 该日志中间件会自动获取或设置 RequestID
func Logger(next echo.HandlerFunc) echo.HandlerFunc {
return func(c echo.Context) (err error) {
req := c.Request()
res := c.Response()
start := time.Now()
id := requestId(req, res)
l := log.With(log.String("id", id))
l.Info(
"Started %s %s for %s",
req.Method, req.RequestURI, c.RealIP(),
log.RawTime(start),
)
c.SetRequest(c.Request().WithContext(context.WithValue(c.Request().Context(), "logger", l)))
c.SetLogger(util.NewCustomLogger(l))
if err = next(c); err != nil {
c.Error(err)
}
stop := time.Now()
content := fmt.Sprintf(
"Completed %s %s %v %s in %v",
req.Method, req.RequestURI, res.Status,
http.StatusText(res.Status), stop.Sub(start),
)
if res.Status >= 500 {
content = color.Cyan(content)
} else if res.Status >= 400 {
content = color.Red(content)
} else if res.Status >= 300 {
if res.Status == 304 {
content = color.Yellow(content)
} else {
content = color.White(content)
}
} else if res.Status >= 200 {
content = color.Green(content)
}
l.Info(content, log.RawTime(stop))
return
}
}