1. 程式人生 > >《SLF4J官方文件》SLF4J遷移工具

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

原文地址

SLF4J遷移者

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

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

Java –jar slf4j-migrator-1.7.21.jar

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

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

限制

SLF4J遷移者作為一個簡單的工具,用於幫你將使用JCL,log4j或JUL的專案檔案遷移到SLF4J。它只能進行基本的轉換步驟。本質上來說,它將替換適當的匯入行(import lines)和日誌器宣告(logger declarations)。

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

package some.package;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

public MyClass { 

 Log logger = LogFactory.getLog(MyClass.class);

 public void someMethod() {
 logger.info("Hello world");
 }
}

遷移後如下:

package some.package;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public MyClass { 

 Logger logger = LoggerFactory.getLogger(MyClass.class);

 public void someMethod() {
 logger.info("Hello world");
 }
}

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

一般限制

•生成指令碼不會被修改

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

•只有支援String型別的訊息

如果您的日誌宣告的包含非字串物件作為其唯一的引數,你將不得不在物件上手動新增一個toString()方法呼叫。

例如:

logger.debug(new Object());

已被手動重新寫為

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

•不支援FATAL級別。

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

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

public void someMethod(Log l1, Log l2) {
 ...
 }

will be converted as 

 public void someMethod(Log l1, Logger l2) {
 ...
 }

從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。