2017-04-07 171 views
0

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

+0

使用单独的测试log4j2配置文件比使用包装类要简单得多。您是否可以完全从代码中删除Log4JEnhancedCoverage? –

+0

也许你应该在你的日志行之前摆脱那些测试。您是否在记录器行中使用昂贵的代码?如果不是,警卫声明并不真正有用。 –

回答

1

使用通用日志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); 
     ... 
+0

好主意,但它不起作用,因为Log4j本身似乎负责创建记录器。看到我上面的更新。 – user3001

+0

@ user3001它在我组合一个示例项目时起作用。你自己说你正在使用commons-logging作为框架层,log4j2作为实现。您的更新状态为“因此,特定记录器的公用日志记录配置完全不受尊重。”这对我来说没有意义,因为公共日志应该没有配置;只有实现层应该有一个配置文件。 –

+0

在'commons-logging.properties'文件中,您可以指定应该使用哪种记录器实现,但Log4j 2 JCL桥接器不再支持。 – user3001

相关问题