软件开发外包网,长沙防疫优化,命理网站开发,2019广东省工程建设网站这种情况一般出现在我们对zap日志库进行二次封装的情况下#xff0c; 在打印日志的时候的源文件非我们期望的文件#xff0c;如下 原因分析
出现这个问题的原因是zap函数内部在调用 runtime.Caller 时的skip层级不对了#xff0c;因为我们进行了二次封装#xff0c;所以za…这种情况一般出现在我们对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博客