一、前言
@Slf4j 是一个非常常用的日志库添加器,由 Lombok 提供。在实际使用过程中,常常遇到实例化日志时传参方式不正确,导致性能问题或空持异常。本文主要介绍在 @Slf4j 中正确使用带参日志的方式,以及正确应对各类情况。
二、日志超级字符串比较比例
在使用日志时,最普遍的传参形式有两种:直接使用 + 进行字符串连接,和使用符合日志库的 位置变量操作方式。举个例子:
1. 直接连接字符串
@Slf4j
public class Example {
public void wrongLogging() {
String name = "Tom";
int age = 25;
log.info("用户姓名: " + name + ", 年龄: " + age);
}
}
主要问题:
- 日志结构中对于运算进行计算,应用存在 DEBUG 等级时,不会展示日志。但进行运算算法还是会执行的,于是發生 性能消耗。
2. 使用正确的传参方式 (位置变量)
@Slf4j
public class Example {
public void correctLogging() {
String name = "Tom";
int age = 25;
log.info("用户姓名: {}, 年龄: {}", name, age);
}
}
资源保护分析:
- 位置变量形式下,如果日志级别为 DEBUG 以下,那么变量的求值就不会执行了,性能上有相对的提升。
三、比较 %s、%d 与 {}
在 SLF4J 中,{} 展示位置变量,但对于有些系统或第三方库,常见的还有使用 %s 和 %d等占位符。此处重点比较:
1. 使用 {}
log.info("用户姓名: {}, 年龄: {}", "Tom", 25);
- 优点: SLF4J 自带计量和校验为一体,性能优化。
- 整合性: 根据 SLF4J 定义,{} 位置占位符添加任何参数都比较自然,不需要指定类型。
2. 使用 %s、%d 等类位置占位符
log.info(String.format("用户姓名: %s, 年龄: %d", "Tom", 25));
- 主要问题: 必须使用 String.format() 进行格式化,比较麻烦,也会增加多余的计算消耗。
- 不适用地方: 在 SLF4J 中,直接使用 %s 不会与 SLF4J 的内置经济性进行符合,远不如 {} 相对于方便和高效。
四、最好实践:避免NullPointerException
在日志中输出变量时,要注意变量为 null的情况,否则可能导致 NullPointerException。
例子:
@Slf4j
public class Example {
public void safeLogging() {
String name = null;
int age = 25;
log.info("用户姓名: {}, 年龄: {}", name, age);
}
}
- SLF4J 结构自动处理了 null的情况,回显时会自动输出为字符串 null ,而不会导致优化实现异常。
五、总结
在日志库中使用应重点于:
- 避免使用 + 进行字符串连接,避免起消而且不必要的性能消耗。
- 使用 位置变量操作方式 (如 {}),它不仅实现性能优化,还能更好地处理实际的变量。
- Lombok 配合 SLF4J 能自动生成日志对象,优化代码量和维护成本。
- 避免使用 %s 和 %d 运算,直接使用 {} 更方便高效,能大大提高性能和兼容性。
使用正确的方法打印日志,能最大限度地提高代码性能和倾沉性,还能避免后续调试中的性能坏烈。