2017-04-07 49 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

相關問題