我目前正在遷移從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? –
也許你應該在你的日誌行之前擺脫那些測試。您是否在記錄器行中使用昂貴的代碼?如果不是,警衛聲明並不真正有用。 –