【问题标题】:How to apply log pattern to both SLF4J _and_ JUL?如何将日志模式应用于 SLF4J 和 JUL?
【发布时间】:2015-11-22 02:13:55
【问题描述】:

我正在使用 logback 和 JUL 到 SLF4J 桥接器(后者用于捕获使用 Java Logging 的第三方库日志语句)。

我从第三方获取日志输出,但日志模式不是我为 Logback 指定的。 JUL 和 Logback 是否应该使用我在 logback.xml 中指定的相同模式?或者我需要单独设置 JUL 吗?最后,如果我需要单独设置 JUL,有没有办法在一个地方定义我的日志输出模式并将其转到 JUL 和 Logback?

我的设置如下:

在我的主类中,我有一个静态块(在类的顶部),其中包含以下几行:

    SLF4JBridgeHandler.removeHandlersForRootLogger();
    SLF4JBridgeHandler.install();

我的 logback.xml 看起来像这样:

<configuration>
    <contextListener class="ch.qos.logback.classic.jul.LevelChangePropagator"/>
    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
            <Pattern>
                %d{HH:mm:ss.SSS} [%-32thread] %-5level | %-80msg | %class.%method\(%file:%line\)%n
            </Pattern>
        </encoder>
    </appender>
    <root level="WARN">
        <appender-ref ref="STDOUT"/>
    </root>
</configuration>

下面是我复制的两行日志输出。您会注意到第一行是我指定的格式,而第二行不是(因为它来自 JUL):

21:06:33.297 [ModelUpdateThread-1             ] INFO  | view Molecules and Complexes took 1 ms for 17116 model elements                  | com.**[blanked out for privacy]**
Sat Nov 21 21:06:33 EST 2015 : com.tomsawyer.licensing.TSILicenseManager - setUseProxy
INFO: setUseProxy: false

【问题讨论】:

    标签: java slf4j logback


    【解决方案1】:

    Logback 中设置的模式应该自动应用于 JUL... 或者更确切地说,因为 JUL 日志记录被移交给 Logback 以记录该模式将适用。

    我看到的问题原来是因为第三方库(来自 tomsawyer)默认将其日志写入标准输出和 JUL。也就是说……除了Logger.info,Tomsawyer 还使用System.out 来编写日志消息。发生这种情况的线索在于我的配置的日志级别(警告)和 Tomsawyer 的输出日志级别(信息)。

    因此,Tomsawyer 的输出确实被发送到 logback,然后被抑制,因为日志级别配置为警告。由于 Tomsawyer 使用System.out 输出到标准输出...我仍然看到了这条消息。

    【讨论】:

      猜你喜欢
      • 2021-05-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多