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

Unit testing 在单元测试期间禁用log4j输出,unit-testing,logging,log4j,Unit Testing,Logging,Log4j,通过静态工厂获取记录器是常见的做法(尽管它完全违背了DI原则)。事实上,这很好,除非您想完全摆脱日志记录,例如在运行单元测试时 通过使用以下法术,我可以关闭log4j日志记录: List<Logger> loggers = Collections.<Logger>list(LogManager.getCurrentLoggers()); loggers.add(LogManager.getRootLogger()); for (Logger logger : log

通过静态工厂获取记录器是常见的做法(尽管它完全违背了DI原则)。事实上,这很好,除非您想完全摆脱日志记录,例如在运行单元测试时

通过使用以下法术,我可以关闭log4j日志记录:

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

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

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

Log4j使用一个名为的类来进行这些内部日志调用。 您可以通过调用
LogLog.setQuietMode(true)
禁用日志的输出。 这需要在第一次调用log4j之前设置,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>

另请参见:如何为非测试场景配置输出?您使用的是构建系统吗?将xml文件放在这里为我修复了它,尽管属性文件由于某种原因无法工作
<?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.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