用SLF4J输出log的正确姿势

本文介绍了SLF4J日志API的几种使用方式及其优劣对比,包括直接字符串拼接、log前做条件判断及使用SLF4J格式化功能。详细解释了如何避免不必要的性能开销,并展示了如何利用SLF4J的格式化语法提高效率。

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

slf4j是Java的一种Log Api,类似Apache Commons Logging 。

SLF4J

#最直接的log方式

logger.debug("Entry number: " + i + " is " + String.valueOf(entry[i]));

这种用字符串拼接的构造方式在debug disabled的情况下,字符串消息还是会被求值,存在类型转换和字符串连接的性能消耗。

#log前做条件判断

if(logger.isDebugEnabled()) {

 logger.debug("Entry number: " + i + " is " + String.valueOf(entry[i]));

}

isDebugEnabled()的方法在debug disabled的情况下不存在构造字符串参数的性能消耗,但是如果debug enabled,debug是否被enabled将会被求值两次:一次是isDebugEnabled(),一次是*debug()*本身(该影响较小,因为求值logger状态花费的时间比真正log一条语句花费的时间的1%都还要小)。
#使用SLF4J的格式化功能

Object entry = new SomeObject();

logger.debug("The entry is {}.", entry);

使用SLF4J的格式化功能,这种用法不存在上面提到的缺点。SLF4J使用自己的格式化语法{},同时提供了适合不同参数个数的方法重载:

logger.debug(String format, Object param); //支持一个参数

logger.debug(String format, Object param1, Object param2); //支持两个参数

logger.debug(String format, Object... param); //任意数量参数,构造参数数组具有一定的性能损耗

连续的{}才被认为是格式化占位符,所以:

logger.debug("Set {1,2} differs from {}", "3"); //output:Set {1,2} differs from 3

logger.debug("Set {1,2} differs from {{}}", "3"); //output:Set {1,2} differs from {3}

用""转义{}占位符

logger.debug("Set \\{} differs from {}", "3"); //output:Set {} differs from 3

用“\”本身转义“{}”中的""

logger.debug("File name is C:\\\\{}.", "file.zip"); //output:File name is C:\file.zip
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值