golang zap日志库 打印日志时显示的源文件始终是同一个问题解决方法 zap.Option函数可选项 zap.AddCallerSkip(1) 使用示例

这种情况一般出现在我们对zap日志库进行二次封装的情况下, 在打印日志的时候的源文件非我们期望的文件,如下

原因分析

出现这个问题的原因是zap函数内部在调用 runtime.Caller 时的skip层级不对了,因为我们进行了二次封装,所以zap框架默认的skip就需要进行自定义调整, 

解决方法

在使用 zap.New 初始化zap日志库的时候,在第2个可选参数里面增加   zap.AddCallerSkip(1)  即可解决。

注意, 上面的的  zap.AddCallerSkip(1)   这个是一个zap.Option选项函数。 增加后的效果如下

zap.Option可选函数定义参考

// An Option configures a Logger.
type Option interface {
	apply(*Logger)
}

// optionFunc wraps a func so it satisfies the Option interface.
type optionFunc func(*Logger)

func (f optionFunc) apply(log *Logger) {
	f(log)
}


// AddCallerSkip increases the number of callers skipped by caller annotation
// (as enabled by the AddCaller option). When building wrappers around the
// Logger and SugaredLogger, supplying this Option prevents zap from always
// reporting the wrapper code as the caller.
func AddCallerSkip(skip int) Option {
	return optionFunc(func(log *Logger) {
		log.callerSkip += skip
	})
}

这个Option  apply函数可选项,在很多的知名框架中都被广泛使用,所以学习golang的小伙伴们有必要对这种使用模式进行学习哦。

总结:这个类型的问题一般都是因为在调用runtime.Caller获取调用堆栈源文件的时候指定的skip不对导致,这个skip 对应调用的层级不同需要有所不同,skip 0表示这个函数本身, 1表示直接调用他的那个函数,2 表示这个Caller函数的调用中间隔了一个函数, 3表示中间隔了2个函数依次类推。  runtime.Caller详情可参考文章golang 获取调用函数的源文件路径和所在行号, 获取异常发生的源文件路径和行号方法 -- runtime.Caller, Callers, CallersFrames获取调用堆栈函数使用与总结-CSDN博客

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值