使用 SLF4J 和 Log4j 2 记录 Java 日志

最后更新: 2025-08-15 19:45:52 +0800 +0800
tags: Java | Log4j2 | Logging | Slf4j
原文以英文撰写。您正在阅读AI翻译版本。

SLF4J 是日志 API 外观。应用代码应依赖 slf4j-api,而部署时选择一个兼容的提供程序, 例如 Log4j 2 或 Logback。SLF4J 2 通过 ServiceLoader 发现提供程序;应只保留一个。 使用 Log4j 2 时,log4j-slf4j2-impl 将 SLF4J 适配到 Log4j Core。 不要将它与 log4j-to-slf4j 组合使用,否则事件会重新进入外观并形成桥接循环。

java
private static final Logger log = LoggerFactory.getLogger(Orders.class);
log.info("Accepted order {}", orderId);
log.warn("Order {} failed validation", orderId, exception);

参数化消息会在日志级别禁用时延迟格式化。应使用显式异常参数,而不是将堆栈跟踪插入文本。

层次结构和配置 #

记录器名称构成以点分隔的层次结构。没有配置级别时,子记录器会继承最近的已配置级别; Log4j 2 中常见的有序级别为 TRACE、DEBUG、INFO、WARN、ERROR 和 FATAL。 Log4j 2 将事件路由到匹配的 LoggerConfig,默认还会经过其祖先的 appender。 仅当专用 appender 不应同时向父级 appender 提供事件时,才设置 additivity="false", 否则会产生重复事件。

Appender 是目的地;布局负责序列化事件。Log4j Core 提供控制台、滚动文件、套接字和其他 appender, 以及模式和 JSON 布局。其插件系统发现 @Plugin 扩展类型,并将配置元素映射到受支持的实现。 配置发现会先遵循显式的 log4j2.configurationFile,然后遵循类路径约定; 在打包可能存在歧义的生产环境中,应使用显式位置。

Log4j 2 可以使用 monitorInterval 监控本地配置。重新加载会改变运行中的系统, 因此应在部署时验证配置,并确保重新加载不会暂时选择不安全的级别、目的地或凭据。

运维数据 #

将关联标识符和稳定的请求元数据放入 SLF4J MDC/Log4j Thread Context, 然后在 finally 块和执行器包装器中清除上下文,以防止跨请求泄漏。 后端能够建立索引时,优先使用结构化字段。绝不记录密码、令牌、会话标识符、私钥或未经脱敏的个人数据; 应在构造日志事件前完成脱敏。限制配置写入和插件加载,因为日志配置属于可执行的运维策略。

参考资料 #

评论

在 GitHub 上阅读或评论(发表评论需要登录)