You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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,键名必须和代码里的一致才能生效。

修复步骤

  1. 统一MDC键名
    先确认代码里存入MDC的键名是x-request-id还是request-id,确保配置里的%X{xxx}和代码中的键名完全匹配。比如代码里是MDC.put("x-request-id", "xxx"),那配置里就要用%X{x-request-id}。

  2. 配置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>
  1. 确保异步Appender传递MDC
    NewRelicAsyncAppender默认会传递MDC,但显式配置更稳妥:
<appender name="ASYNC" class="com.newrelic.logging.logback.NewRelicAsyncAppender">
    <appender-ref ref="STDOUT" />
    <includeMdc>true</includeMdc>
</appender>
  1. 验证日志收集链路
    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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.12 11:40:33