什么是 Logback 自定义参数?
Logback 是 Java 社区广泛使用的日志框架之一,基于 SLF4J 接口实现。 在实际开发中,我们经常需要在日志中动态插入业务相关的信息(如用户ID、请求ID等), 这些信息通常不是固定写死的,而是运行时动态获取的 —— 这就是“自定义参数”的典型应用场景。
常用方式一:MDC(Mapped Diagnostic Context)
MDC 允许你在多线程环境中为每个线程绑定上下文信息,并在日志输出中引用。
// 设置 MDC
MDC.put("userId", "12345");
MDC.put("requestId", UUID.randomUUID().toString());
// 日志中使用 %X{key}
logger.info("处理用户请求");
// 清理(建议在 Filter 或 try-finally 中)
MDC.clear();
在 logback.xml 中配置:
<pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - userId=%X{userId} requestId=%X{requestId} - %msg%n</pattern>
方式二:自定义转换词(Converter)
通过继承 ClassicConverter 实现更复杂的动态字段。
public class CustomParamConverter extends ClassicConverter {
@Override
public String convert(ILoggingEvent event) {
// 例如从 Spring Security 获取当前用户名
return Optional.ofNullable(SecurityContextHolder.getContext().getAuthentication())
.map(Authentication::getName)
.orElse("anonymous");
}
}
注册到 logback.xml:
<conversionRule conversionWord="user"
converterClass="com.example.CustomParamConverter" />
<pattern>%d %user - %msg%n</pattern>
注意事项
- 使用 MDC 时注意在线程池或异步任务中传递上下文(可结合 InheritableThreadLocal 或手动传递)
- 避免在日志中记录敏感信息(如密码、身份证号)
- 高并发场景下频繁 put/clear MDC 可能影响性能,需权衡