Spring Boot项目中如何在New Relic中记录MDC上下文值
Spring Boot + Logback + New Relic:MDC上下文值无法在New Relic中展示
我在Spring Boot项目里用Logback打日志,日志能正常显示在New Relic,但MDC上下文里的x-request-id值看不到。本地Console和logs/logback-app.log文件里都能正常显示这个ID,唯独New Relic里没有。参考官方文档和示例配置后,我的logback配置如下:
<configuration> <appender name="STDOUT" class="ch.qos.logback.core.FileAppender"> <file>logs/logback-app.log</file> <append>false</append> <!-- encoders are assigned the type ch.qos.logback.classic.encoder.PatternLayoutEncoder by default --> <encoder class="com.newrelic.logging.logback.NewRelicEncoder"> </encoder> </appender> <appender name="ASYNC" class="com.newrelic.logging.logback.NewRelicAsyncAppender"> <appender-ref ref="STDOUT" /> </appender> <appender name="Console" class="ch.qos.logback.core.ConsoleAppender"> <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder"> <pattern>%X{request-id} %d %-5level [%thread] %logger{0}: %msg%n</pattern> </encoder> </appender> <root level="TRACE"> <appender-ref ref="ASYNC" /> <appender-ref ref="Console" /> </root> </configuration>
问题原因与修复方案
核心问题
NewRelicEncoder默认不会自动把所有MDC字段注入到New Relic日志事件中,另外注意:你代码里存的是x-request-id,但Console配置里用的是request-id,键名必须和代码里的一致才能生效。
修复步骤
统一MDC键名
先确认代码里存入MDC的键名是x-request-id还是request-id,确保配置里的%X{xxx}和代码中的键名完全匹配。比如代码里是MDC.put("x-request-id", "xxx"),那配置里就要用%X{x-request-id}。配置NewRelicEncoder导入MDC字段
修改NewRelicEncoder的配置,显式指定要包含的MDC字段,或者开启全局导入:
<encoder class="com.newrelic.logging.logback.NewRelicEncoder"> <!-- 方式1:指定单个字段,会作为自定义属性传递给New Relic --> <mdcFields>x-request-id</mdcFields> <!-- 方式2:导入所有MDC字段(按需使用) --> <!-- <includeMdc>true</includeMdc> --> </encoder>
- 确保异步Appender传递MDC
NewRelicAsyncAppender默认会传递MDC,但显式配置更稳妥:
<appender name="ASYNC" class="com.newrelic.logging.logback.NewRelicAsyncAppender"> <appender-ref ref="STDOUT" /> <includeMdc>true</includeMdc> </appender>
- 验证日志收集链路
NewRelicEncoder会输出JSON格式日志,确保你的日志收集工具(比如New Relic Agent、Filebeat)能正确读取并解析这些JSON日志,这样MDC字段才会被识别为日志属性。
修复后的完整配置示例
<configuration> <appender name="STDOUT" class="ch.qos.logback.core.FileAppender"> <file>logs/logback-app.log</file> <append>false</append> <encoder class="com.newrelic.logging.logback.NewRelicEncoder"> <mdcFields>x-request-id</mdcFields> </encoder> </appender> <appender name="ASYNC" class="com.newrelic.logging.logback.NewRelicAsyncAppender"> <appender-ref ref="STDOUT" /> <includeMdc>true</includeMdc> </appender> <appender name="Console" class="ch.qos.logback.core.ConsoleAppender"> <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder"> <pattern>%X{x-request-id} %d %-5level [%thread] %logger{0}: %msg%n</pattern> </encoder> </appender> <root level="TRACE"> <appender-ref ref="ASYNC" /> <appender-ref ref="Console" /> </root> </configuration>
内容的提问来源于stack exchange,提问作者pramesh
相关产品推荐
相关产品推荐

