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