SpringBoot中JsonLayout自定义日志字段:如何设置additionalInfo
解决自定义JsonLayout中additionalInfo字段为null的问题
情况1:设置静态固定值
你的CustomLoggingConfig类已经通过@Setter提供了additionalInfo的设置方法,但logback容器创建这个布局实例时,并未给该属性赋值。需要在logback配置文件(如logback-spring.xml或logback.xml)中配置自定义布局时,显式指定属性值:
<configuration> <appender name="JSON_APPENDER" class="ch.qos.logback.core.ConsoleAppender"> <encoder class="ch.qos.logback.core.encoder.LayoutWrappingEncoder"> <!-- 配置自定义布局类 --> <layout class="com.yourpackage.CustomLoggingConfig"> <!-- 直接设置additionalInfo的静态固定值 --> <additionalInfo>系统版本:v1.0,环境:测试环境</additionalInfo> </layout> </encoder> </appender> <root level="INFO"> <appender-ref ref="JSON_APPENDER"/> </root> </configuration>
logback初始化时会通过@Setter注入该值,日志输出时就能正常显示additionalInfo内容。
情况2:设置动态上下文值
如果需要每个日志事件携带不同的额外信息,不能使用类成员变量(布局实例为单例,成员变量会被全局覆盖),可以利用**MDC(Mapped Diagnostic Context)**传递动态值:
- 修改
CustomLoggingConfig的方法,从MDC中取值:
@Setter public class CustomLoggingConfig extends JsonLayout { public static final String ADDITIONAL_INFO = "additionalInfo"; @Override public void addCustomDataToJsonMap(Map<String, Object> var1, ILoggingEvent var2) { // 从日志事件的MDC中获取动态值,无值时设默认值 String dynamicInfo = var2.getMDCPropertyMap().get(ADDITIONAL_INFO); var1.put(ADDITIONAL_INFO, dynamicInfo != null ? dynamicInfo : "无额外信息"); } }
- 在业务代码中,日志打印前设置MDC值:
// 业务逻辑中添加动态上下文信息 MDC.put(CustomLoggingConfig.ADDITIONAL_INFO, "用户ID:1001,操作:数据库连接"); // 打印日志 log.error("Exception occurred with message: Error in connecting to database"); // 请求结束后清除MDC,避免内存泄漏 MDC.remove(CustomLoggingConfig.ADDITIONAL_INFO);
如果是Web项目,可通过拦截器统一在请求开始时设置MDC,请求结束时清除。
问题根源
你的additionalInfo是类私有成员变量,默认值为null,而logback初始化布局时未对其赋值,因此日志输出时该字段为null。通过配置文件注入静态值,或通过MDC传递动态值,才能让字段显示有效内容。
内容的提问来源于stack exchange,提问作者Ramesh Singh
相关产品推荐
相关产品推荐

