-
Notifications
You must be signed in to change notification settings - Fork 2
/
logger.go
82 lines (63 loc) · 1.65 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
package fox
import (
"time"
"github.com/gin-gonic/gin"
"github.com/fox-gonic/fox/logger"
)
var (
// LoggerContextKey logger save in gin context
LoggerContextKey = "_fox-goinc/fox/logger/context/key"
)
// LoggerConfig defines the config for Logger middleware.
type LoggerConfig struct {
// SkipPaths is an url path array which logs are not written.
// Optional.
SkipPaths []string
}
// Logger middleware
func Logger(config ...LoggerConfig) gin.HandlerFunc {
var conf LoggerConfig
if len(config) > 0 {
conf = config[0]
}
var skip map[string]struct{}
if length := len(conf.SkipPaths); length > 0 {
skip = make(map[string]struct{}, length)
for _, path := range conf.SkipPaths {
skip[path] = struct{}{}
}
}
return func(c *gin.Context) {
var (
start = time.Now()
xRequestID = c.GetHeader(logger.TraceID)
path = c.Request.URL.Path
)
if len(xRequestID) == 0 {
xRequestID = logger.DefaultGenRequestID()
if c.Request.Header != nil {
c.Request.Header.Set(logger.TraceID, xRequestID)
}
}
log := logger.New(xRequestID)
c.Set(LoggerContextKey, log)
c.Header(logger.TraceID, xRequestID)
c.Next()
// Log only when path is not being skipped
if _, ok := skip[path]; !ok {
if raw := c.Request.URL.RawQuery; raw != "" {
path = path + "?" + raw
}
fields := map[string]interface{}{
"method": c.Request.Method,
"path": path,
"client_ip": c.ClientIP(),
"type": "ENGINE",
"status": c.Writer.Status(),
"latency": time.Since(start).String(),
}
errorMessage := c.Errors.ByType(gin.ErrorTypePrivate).String()
log.WithFields(fields).Info(errorMessage)
}
}
}