日誌框架SLF4J

weixin_30639719發表於2020-04-05

1.什麼是SLF4J

SLF4J:Simple Logging Facade for Java,為java提供的簡單日誌Facade。Facade門面,更底層一點說就是介面。它允許使用者以自己的喜好,在工程中通過slf4j接入不同的日誌系統。更直觀一點,slf4j是個資料線,一端嵌入程式,另一端連結日誌系統,從而實現將程式中的資訊匯入到日誌系統並記錄。

因此slf4j入口就是眾多介面的集合,它不負責具體的日誌實現,只在編譯時負責尋找合適的日誌系統進行繫結。具體有哪些介面,全部都定義在slf4j-api中。檢視slf4j-api原始碼就可以發現,裡面除了public final class LoggerFactory類之外,都是介面定義。因此slf4j-api本質就是一個介面定義。

SLF4J只是一個介面,而實際的日誌操作還是由你繫結的Log4J之類的日誌系統(例如log4j)來實現的

 

2.使用SLF4J便於維護

SLF4J使你的程式碼獨立於任意一個特定的日誌API

所有日誌系統都使用同一種操作介面,當系統更改日誌框架時,可以不用修改分散在各處的日誌程式碼,只是替換個繫結的配置檔案

 

3.佔位符(place holder)

佔位符是一個非常類似於在String的format()方法中的%s,因為它會在執行時被某個提供的實際字串所替換。這不僅降低了你程式碼中字串連線次數,而且還節省了新建的String物件。即使你可能沒需要那些物件,例如在DEBUG或者INFO級別的字串連線。因為String物件是不可修改的並且它們建立在一個String池中,它們消耗堆記憶體( heap memory)而且大多數時間他們是不被需要的,例如當你的應用程式在生產環境以ERROR級別執行時候,一個String使用在DEBUG語句就是不被需要的。通過使用SLF4J,你可以在執行時延遲字串的建立,這意味著只有需要的String物件才被建立。而如果你已經使用log4j,那麼你已經對於在if條件中使用debug語句這種變通方案十分熟悉了,但SLF4J的佔位符就比這個好用得多。

使用條件輸出形式或者使用佔位符的方式,否則大量的物件toString和字串拼接帶來嚴重的效能問題。

例如:

if (logger.isDebugEnabled()) {

logger.debug("Processing trade with id: " + id + " symbol: " + symbol);

}

改成佔位符方式:

logger.debug("Processing trade with id: {} and symbol : {} ", id, symbol); 

 

4.slf4j結合log4j配置日誌系統

 

  • slf4j-api-1.6.1.jar – JAR for SLF4J API
  • log4j-1.2.16.jar – JAR for Log4J API
  • slf4j-log4j12-1.6.1.jar – Log4J Adapter for SLF4J

如果你在使用Maven去管理你的專案依賴,你只需要包含SLF4J JAR包,maven會包含它的依賴的相關包。為了和SLF4J一起中使用Log4J,你可以包含以下的依賴在你專案中的pom.xml。

<dependency>

    <groupId>org.slf4j</groupId>

    <artifactId>slf4j-log4j12</artifactId>

    <version>1.6.1</version>

</dependency>

 

<dependency>

    <groupId>org.slf4j</groupId>

    <artifactId>slf4j-log4j12</artifactId>

    <version>1.6.1</version>

</dependency>

 

5。其他注意點

 

1.避免重複列印日誌,務必設定additivity=false,避免重複列印日誌並儲存在磁碟上,浪費磁碟空間。

properties配置:log4j.additivity.handler=false

2.禁止直接使用System.out或System.err輸出日誌或使用e.printStackTrace()列印異常堆疊,由於標準日誌輸出與標準錯誤輸出檔案每次Jboss重啟時才滾動,因此,如果大量輸出送往這兩個檔案,容易造成檔案大小超過作業系統大小限制。注意,這與 catch(Exception e){} 性質一樣惡劣。

3.異常資訊應該包括兩類資訊:案發現場資訊 + 異常堆疊追溯資訊。如果不處理,那麼往上拋。輸出POJO物件類必須有toString方法,否則只輸出此物件的hashCode值(地址值),沒啥參考意義。例如:

logger.error(各類引數或者物件toString +“_”+ e.getMessage(), e); 

 

轉載於:https://www.cnblogs.com/corolcorona/p/6650973.html

相關文章