【发布时间】:2020-04-16 21:09:44
【问题描述】:
这是一个使用 Groovy 的 Gradle 项目,用于应用代码和测试代码。但我使用 logback.xml 文件进行配置。
这里可能很重要的一个因素是我使用 Groovy @Slf4j 注释来提供记录器。
%method 和 %line 转换词通常分别打印为“invoke”和“-1”(尽管有时“invoke0”和“-2”)。
有趣的是,它有时会打印方法和编号:例如,当它是带有Exception 参数的ERROR 级别日志时:
log.error( 'indexSearcher.indexReader.close() threw Exception', e )
...我认为这与带有“位置”数据的e 对象有关,然后 logback 可以利用这些数据。但只是偶尔会打印出带有方法和行号的INFO 级别消息:这很令人费解。
我见过有人在使用异步 appender 时遇到问题,但我的 appender 是 ROLLING_FILE (RollingFileAppender)。这不是异步追加器的扩展。
我尝试了其他 SO 问题中记录的其他补救措施(例如 here):我已将这些行添加到我的附加程序中:
<includeCallerData>true</includeCallerData>
<param name="locationInfo" value="true" />
...没有解决问题。
某处有人说有必要确保调试数据在某个时候打开。在 Groovy 环境中,我不确定如何尝试这个想法。
【问题讨论】:
-
问题出现是因为groovy默认进行动态调用。用于测试 - 尝试使用 @CompileStatic 仅注释一种方法,它将打印正确的方法名称和行号。
-
@daggett 非常感谢您解开这个谜团。我不知道为什么“动态调用”会导致这种奇怪的现象,特别是对于这个特定的模块:超出我的工资等级。
-
groovy 在运行时而不是在编译时搜索所有方法。并间接调用它们——例如通过反射Method.invoke(...)
-
是的,明白这一点:Groovy 显然是一种动态语言......我仍然完全不明白为什么动态方法调用会导致像 logback 这样的模块出现这种故障,尤其是间歇性故障:我推测堆栈帧信息会以某种方式被剥离......有时。我可能会尝试研究它,但对我能理解的期望并不高(更不用说找到解决方案了)。
标签: logging groovy logback slf4j