-
Notifications
You must be signed in to change notification settings - Fork 0
/
doralog.go
59 lines (51 loc) · 1.37 KB
/
doralog.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
package doralog
import (
"crypto/md5"
"fmt"
"time"
"github.com/NoneBorder/dora"
"github.com/astaxie/beego"
"github.com/astaxie/beego/context"
"github.com/rs/zerolog"
)
const (
LogHandlerKey = "doraLogHandler"
)
// trace id key name in the http header
var LogTraceIDHeaderKeyName string = "doraLogTraceID"
func init() {
registerFilter()
}
func registerFilter() {
beego.InsertFilter("/*", beego.BeforeStatic, func(ctx *context.Context) {
loggerI := ctx.Input.GetData(LogHandlerKey)
if loggerI != nil {
// exists logger, return
return
}
traceID := getTraceID(ctx)
logger := dora.With().Str("traceID", traceID).Logger()
ctx.Input.SetData(LogHandlerKey, logger)
})
}
func getTraceID(ctx *context.Context) string {
traceID := ctx.Input.Header(LogTraceIDHeaderKeyName)
if traceID == "" {
// generate when empty
hashStr := time.Now().Format(time.RFC3339Nano) + ctx.Input.URL() + ctx.Input.UserAgent() +
ctx.Input.Cookie(beego.BConfig.WebConfig.Session.SessionName)
hash := md5.Sum([]byte(hashStr))
traceID = fmt.Sprintf("%X", hash[:])
}
ctx.Input.SetData(LogTraceIDHeaderKeyName, traceID)
ctx.Output.Header(LogTraceIDHeaderKeyName, traceID)
return traceID
}
func H(ctx *context.Context) *zerolog.Logger {
loggerI := ctx.Input.GetData(LogHandlerKey)
logger, ok := loggerI.(zerolog.Logger)
if loggerI == nil || !ok {
return &dora.Logger
}
return &logger
}