3

我正在使用 Play 2.1 (Java) 和 Play 附带的默认 logback (1.0.7) 记录器。在我的一个控制器中,我使用“play.Logger”来打印调试日志消息。尽管%class在 logger.xml 中提到了“”,但调用者类名并没有被打印出来。而是“ play.Logger$ALogger”正在打印。我调试到 logbackch.qos.logback.classic.spi.CallerData将堆栈跟踪作为数组返回以识别调用者类。在数组中,我的调用者控制器类位于数组的底部,而顶部是“ play.Logger.ALogger”项,这就是“ ch.qos.logback.classic.pattern.ClassOfCallerConverter”中用于打印类的内容name(cda[0].getClassName())

我确实在这里这里查看了其他类似的线程,但它们似乎没有解决这个问题。

这是我的 XML

<appender name="FILE_DEBUG" class="ch.qos.logback.core.rolling.RollingFileAppender">
    <file>${application.home}/logs/debug_log.log</file>
    <layout class="ch.qos.logback.classic.PatternLayout">
        <pattern>%date - [%level] - from %logger %class in %thread %n%message%n%xException%n</pattern>
    </layout>
    <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
        <level>DEBUG</level>
    </filter>
    <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
        <fileNamePattern>${application.home}/logs/debug_log.%d{yyyy-MM-dd}.log</fileNamePattern>
        <maxHistory>30</maxHistory>
    </rollingPolicy>
</appender>

我错过了什么吗?

4

1 回答 1

0

我最近一直在调查同样的问题,这是我的解决方案:您需要includeCallerData通过添加来设置标志

    <includeCallerData>true</includeCallerData>

到您的附加程序配置。

顺便说一句,如果您正在使用ch.qos.logback.classic.AsyncAppender,您也必须在此处启用该标志,但是一旦您这样做了,您就不必在其他任何地方设置它,因为AsyncAppender通过将调用者数据注入其中来修改日志记录事件。

在我的情况下,将 NOP 附加程序添加到根记录器配置就足以使调用者数据随处可用

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

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

于 2017-10-09T20:37:31.087 回答