日志记录在开发中的重要性不言而喻。目前使用的是推荐的日志包zap
"github.com/natefinch/lumberjack" "go.uber.org/zap" "go.uber.org/zap/zapcore"
使用zap 包记录日志 和 lumberjack 来切割日志。
gin框架
在app目录新增common文件,在该文件下新建logger.go 来初始化日志服务
gin框架在初始化路由的时候会默认use (Logger,Recovery) 两个中间件
我现在在middleware 文件夹下新建 logger.go 和 recovery.go 重写这两个中间件
func GinLogger() gin.HandlerFunc { return func(c *gin.Context) { start := time.Now() c.Set(common.TraceKey,uuid.New().String()) path := c.Request.URL.Path query := c.Request.URL.RawQuery c.Next() cost := time.Since(start) common.LogInfo(c,"request_info:", "status:",c.Writer.Status(), ";path:",path, ";method:",c.Request.Method, ";query:",query, ";ip:",c.ClientIP(), ";errors:",c.Errors.ByType(gin.ErrorTypePrivate).String(), ";cost:",cost, ) } }
然后在main.go 中初始化路由改为
使用uuid 生成 一个不重复的字符串作为 traceId,来记录跟踪日志。
在common文件夹下 新建logger.go 来初始化我们的日志
var ( Logger *zap.SugaredLogger TraceKey = "traceId" ) func InitLogger() { writeSyncer := getLogWriter() encoder := getEncoder() core := zapcore.NewCore(encoder, writeSyncer, zapcore.DebugLevel) //logger := zap.New(core, zap.AddCaller()) //AddCallerSkip跳过指定层级 不加这个参数 打印日志的行数永远是该文件 日志记录方法的行数 logger := zap.New(core, zap.AddCaller(),zap.AddCallerSkip(1)) Logger = logger.Sugar() } func LogDebug(c *gin.Context,args ...interface{}) { args = append(args, ";traceId:",c.GetString(TraceKey)) Logger.Debug(args) } func LogInfo(c *gin.Context,args ...interface{}) { args = append(args, ";traceId:",c.GetString(TraceKey)) Logger.Info(args) } func LogWarn (c *gin.Context,args ...interface{}) { args = append(args, ";traceId:",c.GetString(TraceKey)) Logger.Warn(args) } func LogError (c *gin.Context,args ...interface{}) { args = append(args, ";traceId:",c.GetString(TraceKey)) Logger.Error(args) } func getEncoder() zapcore.Encoder { encoderConfig := zap.NewProductionEncoderConfig() // 格式化时间 可自定义 encoderConfig.EncodeTime = zapcore.ISO8601TimeEncoder encoderConfig.EncodeLevel = zapcore.CapitalLevelEncoder return zapcore.NewConsoleEncoder(encoderConfig) } // 保存文件日志切割 func getLogWriter() zapcore.WriteSyncer { lumberJackLogger := &lumberjack.Logger{ Filename: "./logs/app.log", // 指定日志文件目录 MaxSize: 20, // 文件内容大小, MB MaxBackups: 5, // 保留旧文件最大个数 MaxAge: 30, // 保留旧文件最大天数 Compress: false, // 文件是否压缩 } return zapcore.AddSync(lumberJackLogger) }
我重写了 zap包 封装好的 debug info warn error等记录日志的方法,在这些方法中 加入了traceId
在接口公共返回的地方也加入traceId
以下是一次请求的日志记录
2022-06-30T18:46:39.849+0800 INFO index/test.go:16 [err= 请求失败 num= 1 |more11... ;traceId: 1045cd8c-626b-4670-b86b-550a8d7bcab2] 2022-06-30T18:46:39.849+0800 INFO middleware/logger.go:18 [request_info: status: 200 ;path: /api/index/test/test ;method: POST ;query: ;ip: 127.0.0.1 ;errors: ;cost: 995.6µs ;traceId: 1045cd8c-626b-4670-b86b-550a8d7bcab2]
可以看到一次请求的 日志记录中 都带有traceId
git 地址