-
Notifications
You must be signed in to change notification settings - Fork 19
/
logger.go
70 lines (61 loc) · 1.43 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
package main
import (
"net/http"
"time"
"github.com/gin-gonic/gin"
"github.com/sirupsen/logrus"
"go.elastic.co/apm/module/apmlogrus/v2"
)
type logLevelFlag struct {
logrus.Level
}
func (f *logLevelFlag) Set(s string) error {
level, err := logrus.ParseLevel(s)
if err != nil {
return err
}
f.Level = level
return nil
}
func contextLogger(c *gin.Context) logrus.FieldLogger {
return logrus.WithFields(apmlogrus.TraceContext(c.Request.Context()))
}
func logrusMiddleware(c *gin.Context) {
start := time.Now()
method := c.Request.Method
path := c.Request.URL.Path
if rawQuery := c.Request.URL.RawQuery; rawQuery != "" {
path += "?" + rawQuery
}
c.Next()
logger := contextLogger(c)
status := c.Writer.Status()
entry := logger.WithFields(logrus.Fields{
"path": path,
"method": method,
"duration": time.Since(start),
"client-ip": c.ClientIP(),
"status": status,
})
entry.Time = start
logf := entry.Infof
switch {
case status >= http.StatusInternalServerError:
logf = entry.Errorf
case status >= http.StatusBadRequest:
logf = entry.Warningf
}
logf("%s %s (%d)", c.Request.Method, c.Request.URL.Path, status)
}
func newJSONFormatter() *logrus.JSONFormatter {
return &logrus.JSONFormatter{
FieldMap: logrus.FieldMap{
// ECS
logrus.FieldKeyTime: "@timestamp",
logrus.FieldKeyLevel: "log.level",
logrus.FieldKeyMsg: "message",
// Non-ECS
logrus.FieldKeyFunc: "function.name",
},
}
}