SLF4J+ Log4j 的日誌組合

maven配置:


<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>${slf4j.version}</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>${slf4j.version}</version>
</dependency>
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>${log4j.version}</version>
</dependency>



在查閱 SLF4j的源代碼時,發現  如果 應用 程序 在 調用 

private static final Logger LOGGER = LoggerFactory.getLogger(InstanceReadyServiceImpl.class);


  LOGGER.debug("threadPoolExecutor.getActiveCount  is  {} ", activeThreadCount);

這種場景 下,不需要先 LOGGER.isDebugEnabled() . 。這是因爲 在 SLF4J的源代碼中 幫你做了。


但有一種除外: 如果是直接的 LOGGER.debug("i am nothing"+aa); 這種寫法的SLF4J 卻沒有判斷。

原因如下所示:  純粹的string,需要先字符串聯合,已經浪費了 CPU。故這種寫法 應該先 做 idDebugEnnabled判斷。


存在isDebugEnabled()的判斷邏輯是爲了在避免多餘的字符串拼接,即如果不存在isDebugEnabled()判斷,即使當前日誌級別爲ERROR時,在遇到logger.info()調用時,它還會先拼接日誌消息的字符串,然後進入該方法內,才發現這個日誌語句不用打印。而這種多餘的拼接不僅浪費了多餘的CPU操作,而且會增加GC的負擔。SLF4J則提供以下的方式來解決這個問題:

logger.info("Loading XML bean definitions from {}", encodedResource.getResource());






參考:http://www.blogjava.net/DLevin/archive/2012/11/08/390991.html

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章