为什么log4j输出到stdout



我有以下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);
    }
}

为什么当我调用记录器方法时,除了3个输出文件外,输出也会进入控制台(stdout)?

如果要将文件命名为log4j.properties并将其放在类路径的根目录中,那么默认情况下它会被拾取,不需要将其传递给BasicConfiguration。

在您的情况下,可能发生的情况是Java的类加载器在那里(根目录上)找不到文件,您对BasicConfigurator.config()的无参数调用会使log4j使用默认配置。

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

WEB-INFclasseslog4j.properties

我设法通过删除整个静态块来解决这个问题。出于某种奇怪的原因,BasicConfigurator.config()似乎被调用了。。。(即使其他3个文件也在生成中)

最新更新