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