2012-04-07 72 views
4

我使用logback記錄Java Web服務應用程序,使用嵌入式Jetty。日誌記錄的工作原理基於logback.xml文件...除了一些源自Java的日誌以外,所有日誌都顯示在stderr的jsvc輸出中。我是否可以控制jsvc stderr輸出中顯示的java日誌的日誌格式?

我想專門查看我所有帶有毫秒時間戳的Java生成日誌,以匹配其他日誌,而顯示在jsvc stderr輸出中的日誌只有第二個日誌。

jsvc stdout日誌主要是從澤西島生成的,我看到我自己的代碼被引用,因爲對象註冊了Guice,這讓我希望它可以通過logback進行控制。我不明白是什麼導致這些日誌顯示在jsvc的stderr輸出中,而不是在logback catchall中。有沒有人在使用jsvc時在代碼或配置中解決了類似的問題?

回答

2

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

1

據我所知,jsvc是一個用C編寫的管理Java應用程序的守護進程。它本身並沒有真正運行在Java本身,它的日誌記錄爲stdoutstderr。您可以將jsvc輸出重定向到named pipes,並讓某些進程讀取它們併爲您提供毫秒時間戳。你需要付出多少努力才能投入解決方案。

+0

你明白jsvc是什麼。有問題的錯誤信息由Jersey從我自己的應用程序生成併發送到stderr。我認爲jsvc捕捉stderr並將輸出引導到一個文件。我正在尋找一個解決方案,它會在jsvc達到之前攔截stderr日誌輸出。 – phatfingers 2012-04-17 15:18:28

+0

我已經更新了這個問題,以更清楚地反映我關心的是從Java內部生成的日誌數據,但是顯示在jsvc stderr輸出中。 – phatfingers 2012-04-17 17:33:52

+1

@phatfingers,你在哪裏放logback.xml?如果你在你的webapp的WEB-INF/classes文件夾中有它,那麼Jersey顯然不會將它用於自己的日誌記錄。您需要通過將logging.xml [放入全局類路徑](http://logback.qos.ch/faq.html#configFileLocation)來設置默認日誌記錄。 – 2012-04-17 23:57:25

0

根據客戶端或容器Filter javadoc,Jersey使用JDK Logging API在默認情況下生成其日誌行爲System.out

因此,您必須參考Java Logging guide來設置LogManager,以便按級別或級別過濾它的過濾器,或者將來自System.out的日誌行轉移(或複製)到您自己的文件。使用slf4j自己的代碼

,您必須配置的logback由FileAppender更換ConsoleAppender

+0

我使用slf4j將日誌輸出綁定到logback。有問題的數據顯示在stderr中。 – phatfingers 2012-04-18 06:32:20

+1

正如你所說你想要管理Java進程中的所有日誌行,你需要Jersey輸出來轉移,並且你擁有slf4j/logback的代碼......所以有兩個任務要做。 – 2012-04-18 06:49:07

+0

請提供您的logback XML配置,可能問題在那裏。 – 2012-04-18 06:52:53