2011-03-29 44 views
2

我們在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的怪物都不能阻止這些事情。

+0

將-Dlog4j.debug添加到Tomcat的環境變量中,讓log4j輸出一大堆關於正在讀取的配置文件的診斷信息 – 2011-03-29 23:56:52

+0

謝謝!我明天早上肯定會嘗試第一件事。 – QuantumMechanic 2011-03-30 00:06:21

+0

我試過設置調試屬性。結果已被編輯到原始問題中。 – QuantumMechanic 2011-03-30 19:10:40

回答

1

我已經想通了究竟發生了什麼事。問題是,埋在對Web應用中的另一部分的腸子是當該組件被放入調試模式運行下面的代碼:

public static synchronized void setDebugOn(boolean debugOn) { 
    if (isAllDebugOn()^debugOn) { 
     setAllDebugOn(debugOn); 
     Enumeration en = LogManager.getCurrentLoggers(); 
     while (en.hasMoreElements()) { 
      setDebugOn((Logger) en.nextElement(), debugOn); 
     } 
     setDebugOn(LogManager.getRootLogger(), debugOn); 
    } 
} 

public static void setDebugOn(String name, boolean debugOn) { 
    setDebugOn(getLogger(name), debugOn); 
} 

private static void setDebugOn(Logger logger, boolean debugOn) { 
    logger.setLevel(debugOn ? Level.DEBUG : Level.INFO); 
} 

換句話說,當該組件被置於調試模式,它也將每個單獨的LOG4J記錄器都放入WEBAPP中進入調試模式(我已經通過更改代碼來打印出這三個記錄器中最後一個方法的名稱來驗證它,所以blammo - 所有的第3個-party碰巧使用log4j的東西開始得到它的調試輸出記錄,不管log4j.properties說什麼。嘆息。

當我用那個循環改變方法到onl y混淆與該組件相關的特定記錄器的級別,那麼我的log4j.properties配置開始按預期工作。

2

您可以配置log4j.properties以僅獲取您的代碼日誌,並將其放入與catalina.out不同的文件中。

處理器= org.apache.juli.FileHandler

org.apache.juli.FileHandler.level = ALL org.apache.juli.FileHandler.directory = $ {} catalina.base /日誌 組織。 apache.juli.FileHandler.prefix = yourapp名。

com.yourproject.module.package.level = ALL