該解決方案需要在幾個地方進行更改,主要是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