该解决方案需要在几个地方进行更改,并且主要是 slf4j 配置问题。我的应用程序有许多依赖项,它们引入了各种日志记录实现。Slf4j 旨在将它们全部聚集在一起,并且该过程通常只是一个简单的 jar 插件,但 java.util.logging 需要更多的努力。
slf4j Bridging Legacy APIs页面(主要)描述了如何连接 Jersey 引入的 JUL 依赖项。我已经包含了 jul-to-slf4j.jar,但它没有正确连接。我需要SLF4JBridgeHandler.install()
在我的应用程序的初始化中执行。此外,除非我还在 logback.xml 文件中包含以下内容,否则该页面会警告对性能的负面影响:
<contextListener class="ch.qos.logback.classic.jul.LevelChangePropagator">
<resetJUL>true</resetJUL>
</contextListener>
这让我走了大部分路,但引入了日志事件的重复——一个去了 slf4j,另一个继续到 stderr。Google 将我引向 Claus Neilsen 博客中的一篇文章,“将 java.util.logging 与 SLF4J 桥接”。这包含一个有用的代码片段:
// Jersey uses java.util.logging - bridge to slf4
java.util.logging.Logger rootLogger = LogManager.getLogManager().getLogger("");
Handler[] handlers = rootLogger.getHandlers();
for (int i = 0; i < handlers.length; i++) {
rootLogger.removeHandler(handlers[i]);
}
SLF4JBridgeHandler.install();
有了这些,在我的 jsvc stderr 输出中显示的 Jersey 日志现在与我的其余日志一起显示,并按照 logback.xml 的指示进行了很好的格式化。