背景
公司产品使用了logback作为日志输出框架,日志输出的pattern里配置了打印调用方法名及代码行号的配置,但是实际输出的日志方法名总是显示?
在强迫症的驱使下,开启了探秘之旅
- Logback版本
1.2.3
- 项目中Logging.pattern配置如下:
[%boldBlue(%d{yyyy-MM-dd HH:mm:ss.SSS})][%yellow(${spring.application.name:-},%X{X-B3-TraceId:-},%X{X-B3-SpanId:-},%X{X-Span-Export:-})] [%thread] [%highlight(%-5level)] [%cyan(%logger{50}.%M(%F:%L))] : %msg%n
其中:%M-输出调用方法名、%F-文件名、%L-代码执行行号
问题
- 问题解决前效果如下图:
- 解决后效果图:
探秘之旅
为了处理这个问题,首先的第一想法当然还是寻求度娘的帮助了,如下图:
然并卵,没啥用!为此我还翻了不少博客,最终的结果时,大家似乎没遇到或者不在乎这么个小问题!
当然我也翻了下官方文档,因为英文能力有限,没找到!所以我就用了最笨的办法来找问题:翻源码!!!
搞过Log信息定制的朋友应该知道,pattern里的每个标签都有个对应的类进行解析,那么只要找到解析**%M**的类,就成功大半了。最终皇天不负苦心人!
Debug大法:
咦,cda.length > 0竟然为false?????
ILoggingEvent对象从哪儿来?一切要从源头开始
惊喜!!!!!这就是为什么cda.length > 0为false的根本原因啦啦啦!
验证…
无言。。。
反思
为啥类ch.qos.logback.classic.AsyncAppender中includeCallerData默认为false?这个问题找度娘是可以找到答案的,根本原因是获取方法名、代码行号的方法的性能不太好,所以非必要的情况下不要开启!!!