我正在使用Play 2.1(Java)和Play附带的默认logback(1.0.7)记录器。在我的一个控制器中,我使用“play.Logger”来打印调试日志消息。尽管在logger.xml中提到了“%class
”,但是没有打印出调用者类名。相反,“play.Logger$ALogger
”正在打印。我调试到logback的ch.qos.logback.classic.spi.CallerData
,在那里它返回stacktrace作为数组来识别调用者类。在数组中,我的调用者控制器类位于数组的底部,而顶部是“play.Logger.ALogger
”项,而“ch.qos.logback.classic.pattern.ClassOfCallerConverter
”中使用的是打印类{{1} }。
我确实看过其他类似的帖子here和here,但他们似乎没有解决这个问题。
这是我的XML
name(cda[0].getClassName())
我错过了什么吗?
答案 0 :(得分:0)
我最近一直在调查同一问题,这是我的解决方案:你需要通过添加
来设置includeCallerData
标志
<includeCallerData>true</includeCallerData>
到您的appender配置。
顺便说一下,如果您使用的是ch.qos.logback.classic.AsyncAppender
,那么您也必须在那里启用该标记,但是一旦您这样做,您就不必将其设置在其他地方,因为AsyncAppender
修改了日志记录将调用者数据注入其中的事件。
在我的情况下,将NOP appender添加到根记录器配置就足以使呼叫者数据随处可用
<appender name="NOP" class="ch.qos.logback.core.helpers.NOPAppender" />
<appender name="ASYNC.NOP" class="ch.qos.logback.classic.AsyncAppender">
<includeCallerData>true</includeCallerData>
<appender-ref ref="NOP" />
</appender>
<root level="...">
...
<appender-ref ref="ASYNC.NOP" />
</root>
请记住,获取来电者数据可能会对性能产生严重影响,因此我不会在制作中使用它。