跳过正文

Zap日志包

·410 字
目录

zap
#

go get -u go.uber.org/zap

初始化logger
#

package logs

import (
	"os"

	"github.com/natefinch/lumberjack"
	"go.uber.org/zap"
	"go.uber.org/zap/zapcore"
)

func InitLogger() {
    // 生产环境encoderConfig
	encoderConfig := zap.NewProductionEncoderConfig()
	// 设置日志记录中时间的格式
	encoderConfig.EncodeTime = zapcore.TimeEncoderOfLayout("2006-01-02 15:04:05.000")
	encoderConfig.FunctionKey = "func"
	encoderConfig.CallerKey = "caller"
    // 日志json格式输出
    encoder = zapcore.NewJSONEncoder(encoderConfig)

    // 多文件输出
    cores := make([]zapcore.Core, 0, len(config.WriteSyncers))
    cores = append(cores, zapcore.NewCore(encoder, os.Stdout, zap.DebugLevel))
    cores = append(cores, zapcore.NewCore(encoder, getWriteSyncer("./run.log"), zap.InfoLevel))
    cores = append(cores, zapcore.NewCore(encoder, getWriteSyncer("./warn.log"), zap.WarnLevel))

    core := zapcore.NewTree(cores...)
    logger := zap.New(core)
    // 输出caller, AddCallerSkip(1)用户输出正确的log调用方
	logger = logger.WithOptions(zap.AddCaller(), zap.AddCallerSkip(1))
	defer logger.Sync()
	zap.ReplaceGlobals(logger) // 使用初始化后的logger替换zap全局logger,后续可以使用zap.S() 或者 zap.L()获取全局logger
}

// 分割日志
func getWriteSyncer(filepath string) zapcore.WriteSyncer {
	logger := &lumberjack.Logger{
		Filename:   filepath,
		MaxSize:    500, // 500MB
		MaxAge:     10,  // 10 day
		MaxBackups: 30,  // 30 files
		LocalTime:  true,
		Compress:   true,
	}

	return zapcore.AddSync(logger)
}

封装log方法
#

统一增加traceId field, 通过context.Context传递traceId,方便日志追踪

package logs

import (
	"context"

	"github.com/google/uuid"
	"go.uber.org/zap"
)

type traceKey string

var ctxTraceKey = traceKey("traceId")

const (
	fieldTraceId = "traceId"
)

func AddContextTrace(ctxs ...context.Context) context.Context {
	ctx := context.Background()
	if len(ctxs) > 0 {
		ctx = ctxs[0]
	}
	ctx = context.WithValue(ctx, ctxTraceKey, uuid.NewString())

	return ctx
}

func Debug(ctx context.Context, args ...interface{}) {
	getLogger().With(fieldTraceId, getTraceId(ctx)).Debug(args...)
}

func Info(ctx context.Context, args ...interface{}) {
	getLogger().With(fieldTraceId, getTraceId(ctx)).Info(args...)
}

func getLogger() *zap.SugaredLogger {
	return zap.S()
}

func getTraceId(ctx context.Context) string {
	traceId := ctx.Value(ctxTraceKey)

	if v, ok := traceId.(string); ok {
		return v
	}

	return ""
}