123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114 |
- package middleware
- import (
- "dy-admin/pkg/log"
- "fmt"
- "github.com/gin-gonic/gin"
- "github.com/mattn/go-isatty"
- "os"
- "time"
- )
- var defaultLogFormatter = func(param gin.LogFormatterParams) string {
- var statusColor, methodColor, resetColor string
- if param.IsOutputColor() {
- statusColor = param.StatusCodeColor()
- methodColor = param.MethodColor()
- resetColor = param.ResetColor()
- }
- if param.Latency > time.Minute {
- // Truncate in a golang < 1.8 safe way
- param.Latency = param.Latency - param.Latency%time.Second
- }
- return fmt.Sprintf("%s%3d%s - [%s] \"%v %s%s%s %s\" %s",
- // param.TimeStamp.Format("2006/01/02 - 15:04:05"),
- statusColor, param.StatusCode, resetColor,
- param.ClientIP,
- param.Latency,
- methodColor, param.Method, resetColor,
- param.Path,
- param.ErrorMessage,
- )
- }
- func Logger() gin.HandlerFunc {
- return LoggerWithConfig(gin.LoggerConfig{
- Formatter: defaultLogFormatter,
- Output: nil,
- SkipPaths: nil,
- })
- }
- func LoggerWithConfig(conf gin.LoggerConfig) gin.HandlerFunc {
- formatter := conf.Formatter
- if formatter == nil {
- formatter = defaultLogFormatter
- }
- out := conf.Output
- if out == nil {
- out = gin.DefaultWriter
- }
- notlogged := conf.SkipPaths
- isTerm := true
- if w, ok := out.(*os.File); !ok || os.Getenv("TERM") == "dumb" ||
- (!isatty.IsTerminal(w.Fd()) && !isatty.IsCygwinTerminal(w.Fd())) {
- isTerm = false
- }
- if isTerm {
- gin.ForceConsoleColor()
- }
- var skip map[string]struct{}
- if length := len(notlogged); length > 0 {
- skip = make(map[string]struct{}, length)
- for _, path := range notlogged {
- skip[path] = struct{}{}
- }
- }
- return func(c *gin.Context) {
- // Start timer
- start := time.Now()
- path := c.Request.URL.Path
- raw := c.Request.URL.RawQuery
- // Process request
- c.Next()
- // Log only when path is not being skipped
- if _, ok := skip[path]; !ok {
- param := gin.LogFormatterParams{
- Request: c.Request,
- Keys: c.Keys,
- }
- // Stop timer
- param.TimeStamp = time.Now()
- param.Latency = param.TimeStamp.Sub(start)
- param.ClientIP = c.ClientIP()
- param.Method = c.Request.Method
- param.StatusCode = c.Writer.Status()
- param.ErrorMessage = c.Errors.ByType(gin.ErrorTypePrivate).String()
- param.BodySize = c.Writer.Size()
- if raw != "" {
- path = path + "?" + raw
- }
- param.Path = path
- log.L(c).Info(formatter(param))
- }
- }
- }
|