閱讀976 返回首頁    go 阿裏雲 go 技術社區[雲棲]


《SLF4J官方文檔》SLF4J遷移工具

SLF4J遷移者

SLF4J遷移者是一個很小的Java工具,用於將Java源文件從Jakata Commons Logging(JCL)遷移到SLF4J。它也能將文件從log4j遷移到SLF4J,或者從java.util.logging API到SLF4J。

SLF4J遷移者包括一個獨立的jar文件,可以像獨立運營的java應用一樣運行。命令如下:

1 Java –jar slf4j-migrator-1.7.21.jar

一旦應用運行了,一個像下麵的窗口會顯示:

此應用的使用應該是一目了然的。請注意遷移工具隻是原地替換java文件,這意味著將沒有已修改文件的備份。在使用SLF4J遷移者前,你有義務備份你的文件。

限製

SLF4J遷移者作為一個簡單的工具,用於幫你將使用JCL,log4j或JUL的項目文件遷移到SLF4J。它隻能進行基本的轉換步驟。本質上來說,它將替換適當的導入行(import lines)和日誌器聲明(logger declarations)。

MyClass是個使用JCL的簡單類,替換前如下:

01 package some.package;
02  
03 import org.apache.commons.logging.Log;
04 import org.apache.commons.logging.LogFactory;
05  
06 public MyClass {
07  
08  Log logger = LogFactory.getLog(MyClass.class);
09  
10  public void someMethod() {
11  logger.info("Hello world");
12  }
13 }

遷移後如下:

01 package some.package;
02  
03 import org.slf4j.Logger;
04 import org.slf4j.LoggerFactory;
05  
06 public MyClass {
07  
08  Logger logger = LoggerFactory.getLogger(MyClass.class);
09  
10  public void someMethod() {
11  logger.info("Hello world");
12  }
13 }

盡管轉換規則很基本,但SLF4J遷移者仍可以大大緩解java項目從JCL到SLF4J遷移的繁重工作。從log4j到SLF4J,或從JUL到SLF4J的遷移規則是類似的。

一般限製

•生成腳本不會被修改

您的Ant / Maven/Ivy生成腳本需要手動修改為使用SLF4J,而不是JCL或log4j。

•隻有支持String類型的消息

如果您的日誌聲明的包含非字符串對象作為其唯一的參數,你將不得不在對象上手動添加一個toString()方法調用。

例如:

1 logger.debug(new Object());

已被手動重新寫為

1 logger.debug(new Object().toString());

•不支持FATAL級別。

你必須將它們手動轉換。 此限製不被視為非常嚴重的,因為通常有極少數的日誌聲明承載FATAL級別。

•如果一個方法聲明在同一行的多個日誌器,轉換將是不完整的。 例:

1 public void someMethod(Log l1, Log l2) {
2  ...
3  }
4  
5 will be converted as
6  
7  public void someMethod(Log l1, Logger l2) {
8  ...
9  }

從log4j的遷移時限製

•NDC語句保持原樣

由於NDC不支持SLF4J,遷移者不能正確處理NDC語句。 你必須手動進行遷移到MDC。 同樣,因為通常很少NDC語句,即使在大型項目中此限製不被視為嚴重。

請注意,相反,NDC,因為SLF4J支持這樣的語句MDC陳述正確遷移。

•調用PropertyConfigurator或DomConfigurator無法遷移,因為他們沒有SLF4J對應項。

從JUL遷移時的限製

•java.util.logging.Logger調用finest() finer()或finest()方法都保留原樣。

鑒於finest() finer()或finest()調用可以映射到兩個trace()或debug()調用在SLF4J,不可能猜出用戶希望如何這些調用映射。

•所有匹配的字符串“.severe(”會由字符串“.error(”替換,不帶任何上下文分析。同樣地,所有的字符串匹配“.warning(”是由“.warn(”所取代。

由於匹配/替換操作不是根據語境更改的,如果你的代碼包含了一個名為”severe” 或 “warning”,,那麼遷移的結果將具有編譯錯誤的方法。 幸運的是,這樣的錯誤應該是罕見的,易於識別的。

•在定義下麵的方法調用java.util.logging.Logger類需要手動遷移:log,logp,logrb,entering,exiting。

轉載自 並發編程網 - ifeve.com

最後更新:2017-05-19 16:38:05

  上一篇:go  《Spark大數據分析:核心概念、技術及實踐》Scala編程
  下一篇:go  《Spark大數據分析:核心概念、技術及實踐》大數據技術一覽