SLF4J+ Log4j 的日志组合

本文深入探讨了SLF4J日志框架的配置与使用方法,并解释了其内部实现机制,包括如何避免不必要的字符串拼接以优化性能。重点介绍了在不同场景下如何合理使用日志打印,以及isDebugEnabled()判断逻辑的作用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值