PlayFramework Logback打印来电者的姓名

时间:2013-04-02 05:58:42

标签: playframework-2.0 logback

我正在使用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} }。

我确实看过其他类似的帖子herehere,但他们似乎没有解决这个问题。

这是我的XML

name(cda[0].getClassName())

我错过了什么吗?

1 个答案:

答案 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>

请记住,获取来电者数据可能会对性能产生严重影响,因此我不会在制作中使用它。