/
logger.go
executable file
·88 lines (71 loc) · 1.94 KB
/
logger.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
package middleware
import (
"fmt"
"time"
"github.com/eachinchung/log"
"github.com/gin-gonic/gin"
)
type logFormatterParams struct {
enableColor bool
gin.LogFormatterParams
}
// logFormatter 是 Logger 中间件使用的默认日志格式函数。
var logFormatter = func(param logFormatterParams) string {
var statusColor, methodColor, resetColor string
if param.enableColor {
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",
statusColor, param.StatusCode, resetColor,
param.ClientIP,
param.Latency,
methodColor, param.Method, resetColor,
param.Path,
param.ErrorMessage,
)
}
// Logger 实例一个 Logger 中间件。
func Logger() gin.HandlerFunc {
return LoggerWithConfig(false)
}
// LoggerWithColor 实例一个带颜色的 Logger 中间件。
func LoggerWithColor() gin.HandlerFunc {
return LoggerWithConfig(true)
}
// LoggerWithConfig 实例一个带有 config 的 Logger 中间件。
func LoggerWithConfig(enableColor bool) gin.HandlerFunc {
return func(c *gin.Context) {
// Start timer
start := time.Now()
path := c.Request.URL.Path
raw := c.Request.URL.RawQuery
// Process request
c.Next()
param := logFormatterParams{
enableColor: enableColor,
LogFormatterParams: 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(logFormatter(param))
}
}