簡體   English   中英

Tomcat Log4J問題-找不到附加程序

[英]Tomcat Log4J problem - no appenders could be found

我們有一個非常簡單的tomcat log4j設置。 我們只有一個log4j.properties文件,並在啟動時添加了調試標志,以驗證是否使用了正確的log4j.properties文件。

這是我們的配置:

log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Target=System.out
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d{ABSOLUTE} %5p %.20t:%c{1}:%L - %m%n
log4j.appender.stdout2=org.apache.log4j.ConsoleAppender
log4j.appender.stdout2.Target=System.out
log4j.appender.stdout2.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout2.layout.ConversionPattern=%d{ABSOLUTE} %5p %.20t:%c{1}:%L - %m%n

log4j.rootLogger=INFO, stdout
log4j.logger.com.rei.framework.model.Table=INFO, stdout2
log4j.logger.com.rei.framework.view.SqlGridDisplayGroup=WARN, stdout2

我們遇到的問題是,除非我為每個類專門列出一個記錄器,否則都會出現此錯誤:

log4j:WARN No appenders could be found for logger (com.rei.util.DatabaseConnection).
log4j:WARN Please initialize the log4j system properly.

根據文檔,ROOT記錄器應該是沒有特定配置行的任何類的默認記錄器,但是如果我沒有枚舉配置中的每個類,我會收到許多“找不到附加器”的警告。 在我們的項目中有數百個類,這是無法維護的。

我們在每個類中以這種方式實例化記錄器:

static Logger logger = org.apache.log4j.Logger.getLogger(Myclass.class);

有什么想法為什么不為未定義的類選擇此配置中的根記錄器?

沒錯,log4j.rootLogger應該是默認配置。 當您沒有電話時,您所得到的行為就會發生

log4j.rootLogger=INFO, stdout

在您的文件中。 我已經測試了上面的文件,這對我有用。 因此,在您實際使用的文件中,沒有該行,或者您使用的是與我不同的log4j版本(我已經嘗試使用1.2.9到1.2.16)。

在命令行上指定-Dlog4j.debug時,應該獲得如下輸出:

log4j: Using URL [file:/C:/developpement/mjf-workspace/Stackoverflow/lib/log4j.properties] for automatic log4j configuration.
log4j: Reading configuration from URL file:/C:/developpement/mjf-workspace/Stackoverflow/lib/log4j.properties
log4j: Could not find root logger information. Is this OK?
log4j: Parsing for [com.rei.framework.model.Table] with value=[INFO, stdout2].
log4j: Level token is [INFO].
log4j: Category com.rei.framework.model.Table set to INFO

你明白了嗎?

log4j: Could not find root logger information. Is this OK?

如果您得到了,那么您的log4j.properties文件有問題。 這是我用來測試的Java類:

package uk.co.farwell.stackoverflow;

import org.apache.log4j.*;

public class Log4jTest {
    static Logger logger = Logger.getLogger(Log4jTest.class);

    public static void main(String args[]) {
        logger.debug("hello Log4jTest");
    }
}

編輯:事實證明,您要導入該類並因此使用的Logger類是Apache Commons日志記錄,而不是log4j。 Apache Commons日志記錄使用rootCategory,而不是rootLogger(請參閱配置Log4J

log4j.rootCategory=INFO, stdout

這就是為什么它不使用默認記錄器的原因。 嘗試將此行添加到您的log4j.properties。

混合您的日志記錄框架不是一個好主意,因此請選擇一個並堅持使用。 如果公用記錄適合您,請使用它。 但是不要在代碼中混用和匹配。 這是一個壞主意,並導致很多混亂。

我個人總是使用slf4j slf4j允許您對多個框架進行單一配置,因此默認情況下使用該配置。 slf4j通常是強制性的,因為第三方庫使用commons日志甚至Java日志,並且您不能更改它。 slf4j使用網橋,以便所有內容都出現在同一位置,並且也可以工作。

它還具有許多輔助功能,例如參數化日志記錄

建議:使用slf4j。

確保您的log4j.properties在類路徑中!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM