SLF4J+ Log4j 的日志组合

时间:2022-07-27 22:03:12

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的源代码中 帮你做了。

SLF4J+ Log4j 的日志组合

但有一种除外: 如果是直接的 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());



SLF4J+ Log4j 的日志组合



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