使用Commons日志记录和Log4j 2.0增强代码覆盖率

时间:2017-04-07 08:32:15

标签: java logging code-coverage log4j2 apache-commons-logging

我目前正在从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配置根本不受尊重。

1 个答案:

答案 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);
        ...