我們在Linux上使用Tomcat 5.5。我們的web應用程序使用log4j進行日誌記錄(基於功能的記錄器並不是很多),並故意將記錄器的可加性設置爲false。我們的記錄器登錄到我們自己的日誌文件。他們都沒有登錄到控制檯。如何在Tomcat 5.5中的webapp中通過第三方組件控制日誌記錄?
我們遇到的一個問題是,當我們的記錄器級別設置爲DEBUG時,我們開始從第三方組件,特別是oscache中獲取大量的catalina.out中的調試日誌記錄。
有一個最小的log4j.properties文件在... /通用/類:
log4j.rootLogger=INFO, A1
log4j.appender.A1=org.apache.log4j.ConsoleAppender
log4j.appender.A1.layout=org.apache.log4j.PatternLayout
# Print the date in ISO 8601 format
log4j.appender.A1.layout.ConversionPattern=%d [%t] %-5p %c - %m%n
沒有log4g.properties文件.../webapps /目錄ourapp/WEB-INF/classes中。
我嘗試的第一件事就是更換爲log4j.rootLogger=ERROR, A1
但這沒什麼區別。
我想接下來的事情是創造一個.../webapps /目錄ourapp/WEB-INF /班/ log4j.properties包含單行
log4j.logger.com.opensymphony.oscache=ERROR
,看文件是否會停止OSCache的日誌。它確實,但令人驚訝的是(對我來說)它停止了所有不需要的日誌記錄,而不僅僅是oscache日誌記錄。所以我評論了這條線,並再次嘗試。仍然沒有任何不必要的日誌記錄。我將文件移到一邊,現在不需要的日誌記錄又回來了。我創建了一個零長度的log4j.properties,並且所有不需要的日誌記錄再次消失(!)雖然這是我想要的短期內容,但這讓我想知道其他日誌記錄正在被丟棄(以及爲什麼!)。所以我只是依賴於此而感到不舒服。
Tomcat 5.5文檔中的「日誌記錄」一章只是說,您可以通過在WEB-INF/classes中放置一個屬性文件來完成每個應用程序的配置,但不會(至少不是我能找到的)談論如何與common/classes中指定的配置交互。
所以:
- 如何是第三方組件登錄放在第一位catalina.out的?我猜他們的日誌記錄可能會冒泡到根記錄器,但是爲什麼即使當根記錄器級別變爲ERROR時,它們仍然會記錄日誌?
- 爲什麼在我們的記錄器上設置記錄器級別爲DEBUG使這個記錄開始?我們有自己的記錄器名稱,因此oscache和其他東西不可能成爲我們記錄器的祖先。
- 爲什麼即使是零長度的WEB-INF/classes/log4j.properties文件也會停止一大堆日誌記錄?
- 我該如何做到這一點「正確」的方式,並以有意義的方式限制日誌記錄,而不是依靠一些奇怪的(對我)副作用來關閉它?
奇妙而又奇妙。我試過馬特的開啓調試的建議。我也做了更廣泛的log4j。屬性文件的Web應用程序:
log4j.rootLogger=INFO, SSOA1
log4j.appender.SSOA1=org.apache.log4j.ConsoleAppender
log4j.appender.SSOA1.layout=org.apache.log4j.PatternLayout
# Print the date in ISO 8601 format
log4j.appender.SSOA1.layout.ConversionPattern=%d [%t] %-5p %c - %m%n
log4j.logger.com.opensymphony.oscache=ERROR
#log4j.additivity.com.opensymphony.oscache=false
當Tomcat啓動時我看到:
log4j: Using URL [file:/srv/www/tomcat5/base/webapps/myapp/WEB-INF/classes/log4j.properties] for automatic log4j configuration.
log4j: Reading configuration from URL file:/srv/www/tomcat5/base/webapps/myapp/WEB-INF/classes/log4j.properties
log4j: Parsing for [root] with value=[INFO, SSOA1].
log4j: Level token is [INFO].
log4j: Category root set to INFO
log4j: Parsing appender named "SSOA1".
log4j: Parsing layout options for "SSOA1".
log4j: Setting property [conversionPattern] to [%d [%t] %-5p %c - %m%n].
log4j: End of parsing for "SSOA1".
log4j: Parsed "SSOA1" options.
log4j: Parsing for [com.opensymphony.oscache] with value=[ERROR].
log4j: Level token is [ERROR].
log4j: Category com.opensymphony.oscache set to ERROR
log4j: Handling log4j.additivity.com.opensymphony.oscache=[null]
log4j: Finished configuring.
但是,儘管事實上,OSCache的記錄是有其級別設置爲錯誤,我仍然看到這樣的東西在日誌:
2011-03-30 14:53:22,076 [main] DEBUG com.opensymphony.oscache.base.algorithm.AbstractConcurrentReadCache - get called (key=AUDIT_KEY_OLDEST_TIMSTAMP)
如果我強迫OSCache的記錄水平誤差(其中log4j的調試輸出都說我),那麼這是爲什麼DEBUG消息在被全部送到?子記錄器覆蓋代碼中的級別?
我的注意事項是,如果我在webapp的log4j.properties文件中取消註釋oscache記錄器的「addability」行,那麼記錄確實會消失。所以看起來oscache日誌依賴於祖先的appender而不是它自己的。但是,似乎所有將oscache記錄器級別設置爲ERROR的怪物都不能阻止這些事情。
將-Dlog4j.debug添加到Tomcat的環境變量中,讓log4j輸出一大堆關於正在讀取的配置文件的診斷信息 – 2011-03-29 23:56:52
謝謝!我明天早上肯定會嘗試第一件事。 – QuantumMechanic 2011-03-30 00:06:21
我試過設置調試屬性。結果已被編輯到原始問題中。 – QuantumMechanic 2011-03-30 19:10:40