【问题标题】:Send/redirect/route java.util.logging.Logger (JUL) to Logback using SLF4J?使用 SLF4J 将 java.util.logging.Logger (JUL) 发送/重定向/路由到 Logback?
【发布时间】:2011-08-26 14:33:07
【问题描述】:

是否可以对java.util.logging.Logger 进行典型调用并使用 SLF4J 将其路由到 Logback?这会很好,因为我不必逐行重构旧的 jul 代码。

EG,假设我们有这行:

private static Logger logger = Logger.getLogger(MahClass.class.getName());
//...
logger.info("blah blah blah");

最好将其配置为通过 SLF4J 调用。

【问题讨论】:

  • 是的,有可能。而且非常简单,您无需更改任何源代码。您只需更改一些 .jar 库。看这篇文章-logging-with-slf4j-legacy logging-SLF4J logging
  • 咬紧牙关重构为 slf4j 有一个主要好处。也就是说,您可以在字符串中使用 {} 来延迟 toString() 调用。
  • toString() 真的是现代 JVM 的一个问题吗?我意识到避免 toString() 调用更有效,但我的理解是对象创建很便宜,而且这将属于过早优化。
  • 是的,如果您正在制作丰富的日志记录语句,这确实是一个问题。在 2015 年对现代 jvm 上的生产系统进行分析 不必要的调用来为生产中未实际启用的调试语句创建字符串是生产系统的 cpu 热点。

标签: java logging slf4j


【解决方案1】:

这很容易,不再是性能问题。

SLF4J manual 中记录了两种方法。 Javadocs中也有精确的例子

将 jul-to-slf4j.jar 添加到您的类路径中。或者通过maven依赖:

<dependency>
    <groupId>org.slf4j</groupId>
     <artifactId>jul-to-slf4j</artifactId>
    <version>1.7.0</version>
</dependency>

如果您没有 logging.properties(用于 java.util.logging),请将其添加到您的引导代码中:

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

如果您有 logging.properties(并且想保留它),请将其添加到其中:

handlers = org.slf4j.bridge.SLF4JBridgeHandler

为了避免性能损失,请将此 contextListener 添加到 logback.xml(从 logback 版本 0.9.25 开始):

<?xml version="1.0" encoding="UTF-8"?>
<configuration>

    <contextListener class="ch.qos.logback.classic.jul.LevelChangePropagator">
        <!-- reset all previous level configurations of all j.u.l. loggers -->
        <resetJUL>true</resetJUL>
    </contextListener> 

    ...

</configuration>

【讨论】:

  • 请注意 - 我必须重新加载 Logback 配置才能使其对我有用。
  • 添加 contextListener 配置对于将 logback 配置传播到 jul 记录器是必要的。因此,无论性能改进如何,这对我们来说都是必要的。
  • 它可能在某种程度上与那个错误有关:jira.qos.ch/browse/LOGBACK-404 即没有传播者 Logger 不会保留,然后它们的级别会重置。
猜你喜欢
  • 1970-01-01
  • 2017-12-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-12-12
  • 1970-01-01
  • 2015-05-02
  • 2012-01-29
相关资源
最近更新 更多