为什么log4j输出到stdout?

时间:2012-03-29 16:54:59

标签: java log4j

我有以下log4j.properties文件:

log4j.rootLogger=DEBUG,A1,A2,A3

log4j.appender.A1=org.apache.log4j.RollingFileAppender
log4j.appender.A1.Threshold=DEBUG
log4j.appender.A1.File=log.out
log4j.appender.A1.MaxFileSize=100KB
log4j.appender.A1.MaxBackupIndex=1
log4j.appender.A1.layout=org.apache.log4j.PatternLayout
log4j.appender.A1.layout.ConversionPattern=%p %d %t %c - %m%n

log4j.appender.A2=org.apache.log4j.RollingFileAppender
log4j.appender.A2.Threshold=WARN
log4j.appender.A2.File=warnings.out
log4j.appender.A2.MaxFileSize=100KB
log4j.appender.A2.MaxBackupIndex=1
log4j.appender.A2.layout=org.apache.log4j.PatternLayout
log4j.appender.A2.layout.ConversionPattern=%p %d %t %c - %m%n

log4j.appender.A3=org.apache.log4j.RollingFileAppender
log4j.appender.A3.Threshold=ERROR
log4j.appender.A3.File=errors.out
log4j.appender.A3.MaxFileSize=100KB
log4j.appender.A3.MaxBackupIndex=1
log4j.appender.A3.layout=org.apache.log4j.PatternLayout
log4j.appender.A3.layout.ConversionPattern=%p %d %t %c - %m%n

在我的Java程序中,我定义了以下变量:

private Logger logger = Logger.getRootLogger();

static {
    URL url = MyClass.class.getClassLoader().getResource("/log4j.properties");

    if (url == null) {
        // log4j.properties not found in CLASSPATH, revert to console output
        BasicConfigurator.configure();
    }
    else {
        // log4j.properties found
        PropertyConfigurator.configure(url);
    }
}

为什么在调用logger方法时,输出也会进入控制台(stdout),除了3个输出文件?

2 个答案:

答案 0 :(得分:1)

如果您要将文件命名为log4j.properties并将其放在类路径的根目录中,则默认情况下会将其取出,您无需将其传递给BasicConfigurator。

在你的情况下可能发生的是Java的类加载器没有在那里找到文件(在根目录下),你对没有参数的BasicConfigurator.configure()的调用正在使log4j使用默认配置。

确保log4j.properties是war文件的类路径的根,即:

WEB-INF\classes\log4j.properties

答案 1 :(得分:0)

我设法通过删除整个静态块来解决问题。由于一些奇怪的原因,BasicConfigurator.configure()似乎被调用...(即使其他3个文件也被生成)