0

0

如何解决 Logback 中 MDC.put 值未显示在日志中的问题

花韻仙語

花韻仙語

发布时间:2025-12-29 14:46:02

|

908人浏览过

|

来源于php中文网

原创

如何解决 Logback 中 MDC.put 值未显示在日志中的问题

logback 的 mdc(mapped diagnostic context)值未出现在日志中,通常是因为配置中错误地使用了 `` 而非 `` 来解析 `%x{key}` 占位符;logback 仅在 `` 下支持 mdc 变量渲染,`` 中的 pattern 不会解析 `%x{}`。

在你的 logback.xml 中,当前使用的是 包裹 pattern:


  
    %d  [%X{ApigeeId}] [%X{BasePath}] %-5level %-50logger{40} - %message%n
  

⚠️ 关键问题:Logback 自 1.3.0 版本起(且在所有主流 1.2.x+ 版本中),不支持 MDC 变量(如 %X{key})的动态解析——它仅处理基础日志字段(如 %d, %m, %level)。MDC 支持必须通过 显式声明。

正确写法是改用 (推荐 PatternLayout)


  
    %d  [%X{ApigeeId}] [%X{BasePath}] %-5level %-50logger{40} - %message%n
  
? 验证提示:MDC.get("ApigeeId") 能取到值,说明 MDC 上下文设置无误(线程内有效),问题纯属日志渲染配置缺失。

? 额外注意事项

LLaMA
LLaMA

Meta公司发布的下一代开源大型语言模型

下载
  • 确保 MDC.put() 在日志语句执行之前调用(例如在请求拦截器、AOP 前置通知或 Controller 入口处设置);
  • 若使用异步日志(如 AsyncAppender),需启用 includeCallerData="true" 或显式调用 MDC.copy() 到子线程(因 MDC 是 InheritableThreadLocal,但某些线程池可能不继承);
  • 清理旧 MDC 值:建议在请求结束时调用 MDC.clear(),避免线程复用导致脏数据(尤其在 Tomcat 等容器中)。

✅ 完整可运行示例(含清理逻辑):

// 示例:Spring Boot 拦截器中设置 MDC
public class MdcInterceptor implements HandlerInterceptor {
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) {
        MDC.put("ApigeeId", request.getHeader("X-Apigee-Id"));
        MDC.put("BasePath", request.getServletPath());
        return true;
    }

    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) {
        MDC.clear(); // 必须清理!
    }
}

完成配置更新后重启应用,日志将正确输出类似:

2023-01-11 13:13:09,286  [a1b2c3] [api/crm/sendemi] INFO  org.hibernate.SQL_SLOW - SlowQuery: 14 ms...

总结:MDC 不是“不工作”,而是 Logback 的 pattern 解析机制有明确上下文约束——认准 ,远离 中的 %X{},即可一劳永逸解决空白字段问题。

相关专题

更多
如何配置Tomcat环境变量
如何配置Tomcat环境变量

配置Tomcat环境变量需要在系统中添加CATALINA_HOME变量,并将Tomcat的安装路径添加到PATH变量中。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

113

2023.10.26

idea如何集成Tomcat
idea如何集成Tomcat

idea集成Tomcat的步骤:1、添加Tomcat服务器配置;2、配置项目部署;3、运行Tomcat服务器;4、访问项目;5、注意事项;6、关闭Tomcat服务器。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

164

2024.02.23

怎么查看Tomcat源代码
怎么查看Tomcat源代码

查看Tomcat源代码的步骤:1、下载Tomcat源代码;2、在IDEA中导入Tomcat源代码;3、查看源代码;4、理解Tomcat的工作原理;5、参与社区和贡献;6、注意事项;7、持续学习和更新;8、使用工具和插件。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

94

2024.02.23

常见的tomcat漏洞有哪些
常见的tomcat漏洞有哪些

常见的tomcat漏洞有:1、跨站脚本攻击;2、跨站请求伪造;3、目录遍历漏洞;4、缓冲区溢出漏洞;5、配置漏洞;6、第三方组件漏洞。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

159

2024.02.23

tomcat日志乱码怎么解决
tomcat日志乱码怎么解决

tomcat日志乱码的解决办法:1、修改tomcat的日志编码设置;2、检查ide的编码设置;3、检查操作系统的编码设置;4、使用过滤器处理日志;5、检查外部系统的编码设置;6、检查文件编码方式等等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

149

2024.02.23

weblogic和tomcat有哪些区别
weblogic和tomcat有哪些区别

weblogic和tomcat的区别:1、功能;2、性能;3、规模;4、价格;5、安全性;6、配置和管理;7、社区支持;8、集成能力;9、升级和更新;10、可靠性。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

196

2024.02.23

tomcat和nginx有哪些区别
tomcat和nginx有哪些区别

tomcat和nginx的区别:1、应用领域;2、性能;3、功能;4、配置;5、安全性;6、扩展性;7、部署复杂性;8、社区支持;9、成本;10、日志管理。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

220

2024.02.23

tomcat启动闪退怎么解决
tomcat启动闪退怎么解决

tomcat启动闪退的解决办法:1、检查java环境;2、检查环境变量配置;3、检查端口被占用;4、检查配置文件编码;5、检查启动时需要的配置文件;6、检查相关文件是否丢失;7、检查防火墙和杀毒软件设置。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

154

2024.02.23

ip地址修改教程大全
ip地址修改教程大全

本专题整合了ip地址修改教程大全,阅读下面的文章自行寻找合适的解决教程。

121

2025.12.26

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Java 教程
Java 教程

共578课时 | 38.9万人学习

国外Web开发全栈课程全集
国外Web开发全栈课程全集

共12课时 | 0.9万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号