我想用Logback拦截Jersey的日志记录,但是我不确定如何。有人可以指点一下吗?
最佳答案
泽西岛记录到java.utils
日志记录(JUL)。您可以使用jul-to-slf4j网桥将JUL日志记录重定向到SLF4J。为此,请将org.slf4j:jul-to-slf4j
作为依赖项添加到您的项目中。如果您使用Maven:
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>jul-to-slf4j</artifactId>
<version>${slf4j.version}</version>
</dependency>
要初始化网桥,请在应用程序初始化期间调用
SLF4JBridgeHandler.install()
。但是,这不会从JUL的根记录器中删除任何处理程序,通常会导致日志输出重复(因为JUL仍会产生输出)。要删除JUL处理程序,请调用
SLF4JBridgeHandler.removeHandlersForRootLogger()
。例如,可以在应用程序的main方法或您的主类的静态初始化程序块中完成这些调用。
static {
SLF4JBridgeHandler.removeHandlersForRootLogger();
SLF4JBridgeHandler.install();
}
网桥将仅接收JUL记录器实际处理的日志(基于日志级别)。为了使Logback能够完全控制日志选择,我们需要确保JUL处理了所有日志级别,以便所有日志到达Logback记录器。这是通过将JUL记录器设置为可能的最低日志级别来完成的:
static {
java.util.logging.LogManager.getLogManager().reset();
java.util.logging.Logger.getLogger("global").setLevel(Level.FINEST);
SLF4JBridgeHandler.removeHandlersForRootLogger();
SLF4JBridgeHandler.install();
}
这确实意味着所有日志将由JUL记录器和网桥处理,从而导致性能严重下降。 Logback对此有一个解决方案:通过添加
LevelChangePropagator
上下文侦听器,Logback的日志级别将传播到JUL的记录器。 LevelChangePropagator
还可以从上一个代码块执行JUL日志管理器的重置。要配置所有这些,请将以下内容添加到您的logback.xml
中:<contextListener class="ch.qos.logback.classic.jul.LevelChangePropagator">
<resetJUL>true</resetJUL>
</contextListener>
使用此配置,您可以在此答案中使用第一个初始化块,因为第二个块的前两个语句现在由上下文侦听器处理。确切地说,实际上存在很小的差异:
LogManager.reset()
方法将重置所有日志级别并删除除根记录器之外的所有处理程序,而上下文侦听器上的“ resetJUL”选项仅重置日志级别。总结一下:
添加
jul-to-slf4j
依赖添加初始化代码(此答案的第一个变体)
将
LevelChangePropagator
上下文侦听器添加到您的Logback配置