2013-02-28 47 views
0

我們目前正在使用Tomcat 7,使用-Djava.util.logging.config.file指定的單一日誌配置,以及使用-Djava.util.logging.manager =「org.apache.juli.ClassLoaderLogManager」的默認ClassLoaderLogManager。這適用於一次性啓動配置。在運行時重新加載tomcat日誌記錄?

我們有幾個servlet和其他代碼在servlet上下文之外運行。我們在我們完全控制的專用tomcat服務器上運行,並且我們希望所有代碼都使用相同的日誌配置。我們使用java.util.logging API進行日誌記錄。這意味着LogManager.getLogManager()。getLogger(name)需要工作,並且該Logger.isLoggable(Level)需要工作。

ClassLoaderLogManager似乎與我們的情況相反:允許servlet指定單獨的日誌設置。我們希望將所有日誌控制在一個地方。但是,我們希望像改進FileHandlers的其他JULI好處。

現在的問題:我怎樣才能重新加載這些設置從運行時的文件沒有重新加載應用程序?

我已經試過什麼:

  • LogManager.getLogManger.readConfiguration():結果在ClassLoaderLogManager有效NOOP因爲Thread.currentThread.getContextClassLoader()是不是系統類加載器。
  • 顯式設置Thread.setContextClassLoader(ClassLoader.getSystemClassLoader()),然後調用以上。這實際上是讀取配置文件(在調試器中逐步完成的),但它並未將更改傳播到包含的ClassLoaders中的現有記錄器。 Logger.setLevel()從未在現有記錄器上調用過。
  • 也調用reset()之前這些調用似乎並沒有改變任何東西。
  • JMX似乎只暴露伐木者單個類加載器(可能是系統類加載器)
+0

您是否嘗試過JMX? – 2013-02-28 17:03:36

+0

什麼,具體與JMX? JConsole顯示了java.util.logging上暴露的內容,但它似乎只是頂級ClassLoader的一部分。例如,沒有記錄來自servlet的類。 – TREE 2013-02-28 17:28:16

+0

JConsole ist correct,但是你可以看到[here](http://i.imgur.com/7mNwh5D.png) – 2013-02-28 17:40:24

回答

2

我找到了一個解決方案。使用默認的java.util.logging.LogManager替換啓動腳本中的日誌管理器,或者簡單地刪除命令行參數導致使用常規的LogManager。當調用readConfiguration()時,該LogManager將完全重載所有ClassLoader中所有Logger的配置,這正是我需要的行爲。

但是,這涉及到修改tomcat啓動腳本。如果有人可以在沒有這樣做的情況下找到更好的解決方案,那會很好,否則我會接受這個答案。

0

如果你沒有結婚到Tomcat JULI你可能要考慮使用的logback因爲恕我直言其僅僅是能有效地處理日誌在運行期間重新加載配置。

我自己沒有這樣做,但有人寫了一個指南:Logging with SLF4J and Logback in Tomcat and TomEE它基本上使用一堆橋樑罐。

你可能會考慮的另一件事就是使用每個Web應用程序與Logback進行日誌記錄,並忽略Tomcat的JULI日誌(即我所做的)。

CAVEAThttp://www.slf4j.org/legacy.html#jul-to-slf4j ...因此,請不要直接使用JUL .... Guava和Tomcat是我使用JUL的$ hit列表。

+0

Logback會更新java.util.logging Loggers的日誌級別嗎? – TREE 2013-02-28 18:34:15

+0

不,您會將JULI遷移到SLF4J,然後使用Logback作爲後端。 – 2013-02-28 18:36:47

+0

是的,但我知道我認爲logback在性能方面與java.util.logging有一些問題:http://www.slf4j.org/legacy.html#jul-to-slf4j ...基本上JULI是一個POS。 – 2013-02-28 18:40:42