======================发现问题======================
最近发现服务器日志输出了下面的告警日志:
o.j.m.d.r.service.impl.xxxServiceImpl:137 - Warn: execute Method There are 3 results.
但是看业务类源码,对应行号不可能会有上面的日志输出.
======================分析问题======================
经查找发现,实际日志输出是mybatisPlus中SqlHelper类中的输出,刚好是137行
但是对应的类名确实业务类,根据getObject反向查找引用类,排查出来实际是在其他类中调用了业务类的通用方法(业务类实现了com.baomidou.mybatisplus.extension.service.impl.ServiceImpl):
public <V> V getObj(Wrapper<T> queryWrapper, Function<? super Object, V> mapper) {
return SqlHelper.getObject(log, listObjs(queryWrapper, mapper));
}
这里的log对象最终会返回当前对应的业务类,在SqlHelper中使用的也是ServiceImpl中的log对象,这样最后日志输出就变成了 xxxServiceImpl:137 ………………
======================优化======================
跟踪logback源码,日志的行号输出默认处理类为LineOfCallerConverter(默认取堆栈信息中的第一个类的行号,上面的例子即为SqlHelper中的137行),在PatternLayout中初始化了
增加自定义行号处理类LineConverter,循环堆栈信息,获取className与loggerName一致的行号,这样至少我可以知道业务类哪行输出的日志
在logback-spring.xml中增加自定义处理类配置:
这里需要注意,pattern中配置的对应行号是L还是line,就一定要增加对应的配置,上面截图是两个都配置了
======================Other======================
SpringBoot项目,logback-spring.xml 配置conversionRule读取处理逻辑:
LogbackLoggingSystem.loadConfiguration 读取 classpath:logback-spring.xml 配置文件
GenericConfigurator.buildInterpreter 添加 rule处理规则类
JoranConfiguratorBase中加入了ConversionRuleAction处理类
ConversionRuleAction中,会将logback-spring.xml 配置的conversionRule放入 context中
最后会在 PatternLayoutBase 中,替换掉默认的LineOfCallerConverter 配置: