我目前正在迁移从Log4j的1.2到2的Log4j增强 代码覆盖我们使用Apache通用日志1.1(JCL),用Log4j2作为实施。使用Commons Logging和Log4j的2.0
现在执行时,单元测试,之类的语句
if (log.isInfoEnabled()) {
log.info("example");
}
将显示在覆盖报告未覆盖的行,如果日志记录级别太高(如WARN在此examole),作为if
身体不会是执行。
在Log4j中1人我公司因此写了一个定制记录器,将所有log.isXXXEnabled()
方法返回true,如果它检测到它从Maven的神火运行,像这样:
import org.apache.commons.logging.Log;
import org.apache.commons.logging.impl.Log4JLogger;
public class Log4JEnhancedCoverage implements Log {
private static final long serialVersionUID = -8715529047111858959L;
private final Log logger;
private final boolean mavenRun;
public LogEnhancedCoverage(String name) {
this.logger = new Log4JLogger(_name);
this.mavenRun = TestsRunContext.isMavenSurefireRun();
}
@Override
public boolean isTraceEnabled() {
return (mavenRun) ? true : logger.isTraceEnabled();
}
@Override
public void trace(Object message) {
logger.trace(message);
}
// repeat for warn, info, etc
}
的效果是每个执行块isXXXEnabled()
时,日志语句通过配置文件重定向到log4j。 Log4j本身会看到只显示指定日志级别的消息,而代码块则执行级别的所有级别。 旧:问题是因为您可以看到Log4j记录器实现直接从JCL的impl包实例化。 (是的,他们发布了他们自己的适配器实现!)。
在我的新格局,我使用log4j的-JCL神器,我不知道如何正确地创建在构造函数中的Log4j 2兼容的记录器。
更新:log4j-jcl
船与加载的log4j 2具体实施记录它自己的日志工厂。因此,特定记录器的配置commons-logging
根本不受尊重。
使用单独的测试log4j2配置文件比使用包装类要简单得多。您是否可以完全从代码中删除Log4JEnhancedCoverage? –
也许你应该在你的日志行之前摆脱那些测试。您是否在记录器行中使用昂贵的代码?如果不是,警卫声明并不真正有用。 –