封裝 zap 日志注入 trace 信息 Trace Id(內(nèi)含 gin 例子)

hlog (源碼地址)

  • 實(shí)現(xiàn)自動(dòng)切割文件 (基于 lumberjack 實(shí)現(xiàn))
  • 實(shí)現(xiàn)可傳遞 trace 信息 (基于 Context 實(shí)現(xiàn))

配置

  • Development bool // 是否開發(fā)模式
  • LogFileDir string // 日志路徑
  • AppName string // APP名字
  • MaxSize int //文件多大開始切分
  • MaxBackups int //保留文件個(gè)數(shù)
  • MaxAge int //文件保留最大實(shí)際
  • Level string // 日志打印等級(jí)
  • CtxKey string //通過 ctx 傳遞 hlog 信息
  • WriteFile bool // 是否寫入文件
  • WriteConsole bool // 是否控制臺(tái)打印
實(shí)現(xiàn)自動(dòng)切割文件核心代碼
 zapcore.AddSync(&lumberjack.Logger{
        Filename:   l.opts.LogFileDir + "/" + l.opts.AppName + ".log",
        MaxSize:    l.opts.MaxSize,
        MaxBackups: l.opts.MaxBackups,
        MaxAge:     l.opts.MaxAge,
        Compress:   true,
        LocalTime:  true,
    })

實(shí)現(xiàn)可傳遞 trace 信息核心代碼

func (l *Logger) GetCtx(ctx context.Context) *zap.Logger {
    log, ok := ctx.Value(l.opts.CtxKey).(*zap.Logger)
    if ok {
        return log
    }
    return l.Logger
}

func (l *Logger) AddCtx(ctx context.Context, field ...zap.Field) (context.Context, *zap.Logger) {
    log := l.With(field...)
    ctx = context.WithValue(ctx, l.opts.CtxKey, log)
    return ctx, log
}

例子(普通)

hlog.NewLogger()
hlog.GetLogger().Info("hconf example success")

{"L":"INFO","T":"2021-12-14T11:43:13.276+0800","C":"hlog/zap.go:34","M":"[initLogger] zap plugin initializing completed"}
{"L":"INFO","T":"2021-12-14T11:43:13.277+0800","C":"hlog/zap_test.go:12","M":"hconf example success"}

例子(gin)

func AddTraceId() gin.HandlerFunc {
    return func(g *gin.Context) {
        traceId := g.GetHeader("traceId")
        if traceId == "" {
            traceId = uuid.New().String()
        }
        ctx, log := hlog.GetLogger().AddCtx(g.Request.Context(), zap.Any("traceId", traceId))
        g.Request = g.Request.WithContext(ctx)
        log.Info("AddTraceId success")
        g.Next()
    }
}

log := hlog.GetLogger().GetCtx(context.Request.Context())
        log.Info("test")
        log.Debug("test")   

例子(gin)開發(fā)模式

hlog.NewLogger()    

curl http://127.0.0.1:8888/test

{"L":"INFO","T":"2021-12-14T11:46:00.170+0800","C":"example/main.go:35","M":"hconf example success"}
{"L":"INFO","T":"2021-12-14T11:46:03.956+0800","C":"example/main.go:19","M":"AddTraceId success","traceId":"b1471a7c-5ae8-4bfd-bbdc-5312e072719c"}
{"L":"INFO","T":"2021-12-14T11:46:03.956+0800","C":"example/main.go:31","M":"test","traceId":"b1471a7c-5ae8-4bfd-bbdc-5312e072719c"}
{"L":"DEBUG","T":"2021-12-14T11:46:03.956+0800","C":"example/main.go:32","M":"test","traceId":"b1471a7c-5ae8-4bfd-bbdc-5312e072719c"}

例子(gin)生產(chǎn)模式

hlog.NewLogger(
    hlog.SetDevelopment(false))

curl http://127.0.0.1:8888/test
    
{"level":"info","ts":1639453661.4718382,"caller":"example/main.go:36","msg":"hconf example success"}
{"level":"info","ts":1639453664.7402327,"caller":"example/main.go:19","msg":"AddTraceId success","traceId":"68867b89-c949-45a4-b325-86866c9f869a"}
{"level":"info","ts":1639453664.7402515,"caller":"example/main.go:32","msg":"test","traceId":"68867b89-c949-45a4-b325-86866c9f869a"}
{"level":"debug","ts":1639453664.7402549,"caller":"example/main.go:33","msg":"test","traceId":"68867b89-c949-45a4-b325-86866c9f869a"}
        
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容