在使用 SLF4J(Simple Logging Facade for Java) 打印 error 日志并传入参数时,推荐使用 占位符 {} 的方式,这是 SLF4J 的标准做法,既高效又安全。
✅ 正确用法:使用占位符 {} 传参
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class Example {
private static final Logger log = LoggerFactory.getLogger(Example.class);
public void someMethod(String userId, Exception ex) {
// 单个参数
log.error("用户 {} 不存在", userId);
// 多个参数
log.error("处理订单 {} 时发生错误,用户ID: {}", "ORD12345", userId);
// 带异常堆栈(最后一个参数是 Throwable)
log.error("数据库连接失败,用户: {}", userId, ex);
}
}
🔑 关键规则:
占位符 {} 自动替换为参数的 toString() 结果
- 不会因参数为 null 而抛空指针异常(SLF4J 会输出 “null” 字符串)。
异常(Throwable)必须作为最后一个参数
// ✅ 正确:异常在最后
log.error(“操作失败,ID: {}”, id, exception);
// ❌ 错误:异常不在最后,不会打印堆栈!
log.error(“操作失败: {}, ID: {}”, exception, id);
性能优化:避免字符串拼接
// ❌ 不推荐:即使日志级别关闭,也会执行字符串拼接
log.error("Error: " + message + ", code: " + code);
// ✅ 推荐:只有当日志级别启用时才格式化
log.error(“Error: {}, code: {}”, message, code);
📝 输出示例
假设:
String userId = “U1001”;
Exception ex = new IllegalArgumentException(“Invalid input”);
log.error(“用户 {} 操作失败”, userId, ex);
输出类似:
ERROR com.example.Example – 用户 U1001 操作失败
java.lang.IllegalArgumentException: Invalid input
at com.example.Example.someMethod(Example.java:15)
…
⚠️ 注意事项
- 确保项目中已引入 SLF4J 的实现(如 Logback、Log4j2 with SLF4J binding)。
- 如果使用 Logback(SLF4J 默认实现),无需额外配置即可生效。
- 占位符数量要与参数数量匹配,否则多余参数会被忽略或报错(取决于实现)。
总结
场景 写法
普通错误日志 log.error(“消息: {}”, param);
多参数 log.error(“A={}, B={}”, a, b);
带异常堆栈 log.error(“描述: {}”, param, exception);
✅ 始终使用 {} 占位符 + 参数形式,这是 SLF4J 最佳实践!
网硕互联帮助中心



评论前必须登录!
注册