当前位置: 首页 > news >正文

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博客

http://www.lryc.cn/news/425769.html

相关文章:

  • BL196MQTT远程IO模块助力智能楼宇自动化升级
  • 【面试宝典】Java面向对象面试题总结(上)
  • 如何运用独特的产业运营体系打造一流的数字媒体产业园
  • 安全基础学习-SHA-256
  • Redis中Big Key该如何解决?
  • 基于springboot的实习管理系统
  • 土地利用/土地覆盖遥感解译与基于CLUE模型未来变化情景预测
  • Rust 之环境搭建
  • 基于微信小程序地图实现点位标注、覆盖物、地图聊天
  • xxl-job的分片广播+单播
  • 情感分类代码
  • WPF—常用控件、属性、事件、详细介绍
  • Oracle遭遇bug导致共享内存无法分配报ORA-04031错误
  • SAP BRIM用于应收账款AR收入中台
  • LVS原理简介
  • Qt五大核心特性之元对象系统
  • 开放式耳机伤耳朵吗?开放式耳机在一定程度上保护我们的耳朵
  • JAVA打车小程序APP打车顺风车滴滴车跑腿源码微信小程序打车系统源码
  • 批量智慧:揭秘机器学习中的批量大小
  • 苹果Vision Pro生态发展:现状、挑战与未来展望
  • 湖南第一师范学院来访炼石,推动密码与数据安全合作
  • 全面解析ETL:数据仓库架构中的关键处理过程
  • keepalived的介绍与配置
  • 二叉树概念与使用
  • MongoDB 在 Java 中的使用教程
  • 微前端架构下的配置管理:策略、实现与最佳实践
  • React Native中好用的UI组件库
  • WebSocket 快速入门
  • MySQL中的存储文件和IO机制详细解析
  • 复习之 java 锁