7月至SLF4J大桥

2022-08-31 12:28:42

我目前正在观察第三方库(即restfb)正在使用java.util.log,我看到这些日志最终在STDOUT中,即使我没有在我的logback中配置SLF4J控制台附加器.xml。我的类路径中也有 jul-to-slf4j 桥。安装网桥时,7-to-slf4j 网桥是否仅记录到通过 logback 配置的附加器,还是也记录到 stdout?


答案 1

您需要调用 SLF4JBridgeHandler.install()。您还需要在 java.util.logging 中启用根记录器的所有日志级别(原因在下面的摘录中),并删除默认的控制台追加器。

此处理程序将 jul 日志记录重定向到 SLF4J。但是,只会重定向在 j.u.l. 中启用的日志。例如,如果调用 j.u.l. 记录器的日志语句禁用了该语句,则根据定义,该语句将无法访问任何 SLF4JBridgeHandler 实例,并且无法重定向。

整个过程可以像这样完成

import java.util.logging.Logger;
import org.slf4j.bridge.SLF4JBridgeHandler;

SLF4JBridgeHandler.removeHandlersForRootLogger();
SLF4JBridgeHandler.install();
Logger.getLogger("").setLevel(Level.FINEST); // Root logger, for example.

出于性能原因,您可以将级别设置为高于最佳级别,但是如果不先启用这些日志,您将无法打开这些日志(出于上面摘录中提到的原因)。java.util.logging


答案 2

正如在 SLF4JBridgeHandler 的 javadocs 中提到的,您可以通过调用以编程方式安装 SLF4JBridgeHandler:

 // Optionally remove existing handlers attached to j.u.l root logger
 SLF4JBridgeHandler.removeHandlersForRootLogger();  // (since SLF4J 1.6.5)

 // add SLF4JBridgeHandler to j.u.l's root logger, should be done once during
 // the initialization phase of your application
 SLF4JBridgeHandler.install();

或通过 logging.properties

 // register SLF4JBridgeHandler as handler for the j.u.l. root logger
 handlers = org.slf4j.bridge.SLF4JBridgeHandler

至于性能,关于 jul-to-slf4j 桥接的部分讨论了这个问题。实质上,由于您已经在使用 logback,因此无论负载如何,启用 LevelChangePropagator 都应该会产生良好的性能。


推荐