我目前正在从Log4j 1.2迁移到Log4j 2。 我们使用Apache Commons Logging 1.1(JCL),Log4j2作为实现。
现在执行单元测试时,语句如
if (log.isInfoEnabled()) {
log.info("example");
}
如果日志日志级别太高(如此考试中的WARN),将在覆盖率报告中显示为未覆盖的行,因为if
正文不会被执行。
在Log4j 1中,我公司的某个人编写了一个自定义记录器,如果它检测到它是从Maven Surefire运行的话,它将对所有log.isXXXEnabled()
方法返回true,如下所示:
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()
块都被执行,log语句通过配置文件重定向到log4j。 Log4j本身将看到只显示指定日志级别的消息,而执行所有级别的代码块。
旧:问题是您可以看到Log4j记录器实现是直接从JCL的impl包实例化的。 (是的,他们发布了自己的适配器实现!)。
在我的新设置中,我正在使用log4j-jcl工件,我不知道如何在构造函数中正确创建兼容Log4j 2的记录器。
更新: log4j-jcl
附带自己的日志工厂,该工厂加载log4j 2特定的记录器实现。因此,特定记录器的commons-logging
配置根本不受尊重。
答案 0 :(得分:1)
只需使用commons日志记录API获取记录器,而不是直接实例化它,您就可以了。
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
//REMOVE THIS: 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 Log4JEnhancedCoverage(String name) {
//REMOVE THIS: this.logger = new Log4JLogger(name);
this.logger = LogFactory.getLog(name);
...