该解决方案需要在几个地方进行更改,主要是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>
这让我最的方式存在,但出台日志events--一个去重复slf4j和另一个继续stderr。谷歌指引我到克劳斯尼尔森的博客文章“Bridging java.util.logging to 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输出高达泽西日志显示了我的日志的其余部分,很好地格式化,作为导演的logback .XML。
你明白jsvc是什么。有问题的错误信息由Jersey从我自己的应用程序生成并发送到stderr。我认为jsvc捕捉stderr并将输出引导到一个文件。我正在寻找一个解决方案,它会在jsvc达到之前拦截stderr日志输出。 – phatfingers 2012-04-17 15:18:28
我已经更新了这个问题,以更清楚地反映我关心的是从Java内部生成的日志数据,但是显示在jsvc stderr输出中。 – phatfingers 2012-04-17 17:33:52
@phatfingers,你在哪里放logback.xml?如果你在你的webapp的WEB-INF/classes文件夹中有它,那么Jersey显然不会将它用于自己的日志记录。您需要通过将logging.xml [放入全局类路径](http://logback.qos.ch/faq.html#configFileLocation)来设置默认日志记录。 – 2012-04-17 23:57:25