禁用log4j日志记录到控制台

时间:2014-01-31 09:46:21

标签: java logging log4j slf4j

我有以下log4j.properties文件:

# Direct log messages to a log file
log4j.appender.fileerror=org.apache.log4j.RollingFileAppender
log4j.appender.fileerror.File=C\:\\logs_eba\\loging-error.log
log4j.appender.fileerror.MaxFileSize=20MB
log4j.appender.fileerror.MaxBackupIndex=1
log4j.appender.fileerror.layout=org.apache.log4j.PatternLayout
log4j.appender.fileerror.layout.ConversionPattern=%d{ABSOLUTE} %5p %c{1}:%L - %m%n 
log4j.appender.fileerror.threshold = WARN

# Direct log messages to stdout
#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 %c{1}:%L - %m%n

# Root logger option
log4j.rootLogger = WARN, fileerror

但是我的应用程序不断将日志定向到我的控制台,即使我定义了WARN阈值,它甚至会在信息级别显示日志。

作为参考,这就是我获取Logging对象的方法:

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

    private static final Logger log = LoggerFactory.getLogger(MyClass.class.getSimpleName());
log.warn("My log message");

这与我使用slf4j有关吗?

PS。我使用Spring + Hibernate作为我的架构,他们的日志也被重定向到控制台。

2 个答案:

答案 0 :(得分:1)

Log4J默认在类路径中查找log4j.properties文件,并会考虑首先找到的文件。因此,如果您的应用程序依赖于一个库本身依赖于log4j并且还提供了自己的log4j.properties,那么它有可能被选中。

因此我建议您使用

指定属性的自定义位置
java -Dlog4j.configuration=customName

或使用-Dlog4j.debug查找有关log4j配置的有用信息。

答案 1 :(得分:0)

正如Narendra的回答中所提到的,这可能是因为你的一个依赖库有自己的log4j.properties,它正由应用程序拾取(你的log4j.properties被忽略)。理想情况下,这不应该发生,因为大多数开源库不包含log4j.properties文件。他们希望调用模块提供一个。

找出此属性文件来自哪个模块。如果它是您可以控制的内部项目,则应从中删除log4j.properties。如果这是一个外部jar,请尝试覆盖它上面的log4j.properties文件。如何执行此操作取决于您如何将罐子部署在一起,例如使用maven,文件复制等。

PS:恕我直言,没有标准的开源项目应该包含自己的log4j.properties文件,原因就在于此。如果你正在使用这样的库,可能它不是很成熟,你可能想看看替代品。