在单元测试期间禁用log4j输出



通过静态工厂获取记录器是一种常见的做法(尽管它完全破坏了DI原理)。实际上,这很好,除非你想完全取消日志记录,例如在运行单元测试时。

我能够关闭log4j日志记录,通过使用以下拼写:

 List<Logger> loggers = Collections.<Logger>list(LogManager.getCurrentLoggers());
 loggers.add(LogManager.getRootLogger());
 for (Logger logger : loggers) {
     logger.setLevel(Level.OFF);
 }

尽管如此,它还是在一开始就将一些设置信息打印到控制台:

log4j: reset attribute= "false".
log4j: Threshold ="null".
log4j: Retreiving an instance of org.apache.log4j.Logger.
log4j: Setting [test] additivity to [false].
log4j: Level value for test is  [DEBUG].
...

在运行单元测试套件时,如何以编程方式禁用它?

您可能已经在log4j.propertieslog4j.xml文件中启用了内部log4j日志记录。

Log4j使用一个名为LogLog的类来进行这些内部日志调用。您可以通过调用LogLog.setQuietMode(true)来禁用LogLog的输出。这需要在触发初始化的log4j的第一次调用之前设置。不过,请注意,setQuietMode()不仅禁用调试输出,还禁用警告。

因此,我建议您在测试中使用单独的日志记录配置。雷德瓦尔德在他们联系的答案中概述了如何做到这一点。

下面是一个可以使用的示例log4j.xml文件。请注意debug="false"属性。不过,由于默认值为false,因此不必严格设置此值。

如果您使用maven,请将该文件放在src/test/resources中,这将确保该文件将用于测试,而不是您的主配置文件。

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">
<log4j:configuration debug="false" xmlns:log4j='http://jakarta.apache.org/log4j/'>
    <appender name="console" class="org.apache.log4j.ConsoleAppender">
        <layout class="org.apache.log4j.PatternLayout">
            <param name="ConversionPattern" value="%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%n"/>
        </layout>
    </appender>
    <root>
        <level value="OFF"/>
        <appender-ref ref="console"/>
    </root>
</log4j:configuration>

这是等效的log4j.properties文件:

log4j.debug=false
log4j.rootLogger=OFF, console
log4j.appender.console=org.apache.log4j.ConsoleAppender
log4j.appender.console.layout=org.apache.log4j.PatternLayout
log4j.appender.console.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%n

最新更新