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.
65 lines
1.5 KiB
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
|
|
}
|
|
}
|
|
|