Den*_*gin 13 logging unit-testing log4j
通常的做法是通过静态工厂获得记录器(虽然它完全支持DI原理).实际上它很好,除非你想完全摆脱日志记录,例如在运行单元测试时.
我可以通过使用以下拼写关闭log4j日志记录:
List<Logger> loggers = Collections.<Logger>list(LogManager.getCurrentLoggers());
loggers.add(LogManager.getRootLogger());
for (Logger logger : loggers) {
logger.setLevel(Level.OFF);
}
Run Code Online (Sandbox Code Playgroud)
它仍然在一开始就将一些设置信息打印到控制台:
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].
...
Run Code Online (Sandbox Code Playgroud)
在运行单元测试套件时,如何以编程方式禁用它?
Joh*_*erg 15
您可能已在您的log4j.properties或log4j.xml文件中启用了内部log4j日志记录.
Log4j使用一个名为LogLog的类来进行这些内部日志记录调用.您可以通过调用禁用LogLog的输出LogLog.setQuietMode(true).这需要在第一次调用log4j 之前设置,这会触发初始化.但请注意,这setQuietMode()不仅会禁用调试输出,还会禁用警告.
因此,我建议您为测试使用单独的日志记录配置.Raedwald在与他们联系的答案中概述了如何做到这一点.
这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>
Run Code Online (Sandbox Code Playgroud)
这是等效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
Run Code Online (Sandbox Code Playgroud)