gin框架学习六之日志记录

日志记录在开发中的重要性不言而喻。目前使用的是推荐的日志包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 地址

GitHub - hailin86/ginApi at log

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值