先看下MDC是什么

Mapped Diagnostic Context,用于打LOG时跟踪一个“会话“、一个”事务“。举例,有一个web controller,在同一时间可能收到来自多个客户端的请求,如果一个请求发生了错误,我们要跟踪这个请求从controller开始一步步都执行到了哪些代码、有哪些log的输出。这时我们可以看log文件,但是log文件是多个请求同时记录的,基本无法分辨哪行是哪个请求产生的,虽然我们可以看线程,但线程可能被复用,也是很难分辨出,这时MDC就派上用场了。

我们可以加一个web filter,在请求进来时,把”标识“放到MDC context中,比如:put( ip, 8.8.8.8), put(username, 'yang'),在filter结束时把context再清掉,即可在整个请求处理过程中,都可以打印出ip, username这些数据,就可以方便的用于日志跟踪。

在SpringBoot中怎么用

1. 写一个LogInterceptor,用于统一处理MDC:

  1.  
    @Component
  2.  
    public class LogInterceptor implements HandlerInterceptor {
  3.  
     
  4.  
    private final static String REQUEST_ID = "requestId";
  5.  
    private static final Logger LOGGER = LoggerFactory.getLogger(LogInterceptor.class);
  6.  
     
  7.  
    @Override
  8.  
    public boolean preHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o) throws Exception {
  9.  
    String xForwardedForHeader = httpServletRequest.getHeader("X-Forwarded-For");
  10.  
    String remoteIp = httpServletRequest.getRemoteAddr();
  11.  
    String uuid = UUID.randomUUID().toString();
  12.  
    LOGGER.info("put requestId ({}) to logger", uuid);
  13.  
    LOGGER.info("request id:{}, client ip:{}, X-Forwarded-For:{}", uuid, remoteIp, xForwardedForHeader);
  14.  
    MDC.put(REQUEST_ID, uuid);
  15.  
    return true;
  16.  
    }
  17.  
     
  18.  
    @Override
  19.  
    public void postHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, ModelAndView modelAndView) throws Exception {
  20.  
    String uuid = MDC.get(REQUEST_ID);
  21.  
    LOGGER.info("remove requestId ({}) from logger", uuid);
  22.  
    MDC.remove(REQUEST_ID);
  23.  
    }
  24.  
     
  25.  
    @Override
  26.  
    public void afterCompletion(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) throws Exception {
  27.  
     
  28.  
    }
  29.  
    }
关键代码在于:MDC.put(REQUEST_ID, uuid);

2. 注册一下这个Interceptor,写一个WebMvcConfigurer类:

  1.  
    @Configuration
  2.  
    public class WebMvcConfigurer extends WebMvcConfigurerAdapter {
  3.  
    @Autowired
  4.  
    private LogInterceptor logInterceptor;
  5.  
     
  6.  
    @Override
  7.  
    public void addInterceptors(InterceptorRegistry registry) {
  8.  
    registry.addInterceptor(logInterceptor);
  9.  
    super.addInterceptors(registry);
  10.  
    }
  11.  
    }
3. 放一个logback.xml到src/main/resources/目录中,用于配置logback的参数,如没有,请新建一个
  1.  
    <configuration scan="true" scanPeriod="30 seconds" debug="true">
  2.  
     
  3.  
    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
  4.  
    <target>System.out</target>
  5.  
    <encoder>
  6.  
    <pattern>[%date{ISO8601}] [%-5level] - [%thread] [%X{requestId}] [%logger] [%X{akkaSource}] - %msg %rootException %n
  7.  
    </pattern>
  8.  
     
  9.  
    </encoder>
  10.  
    </appender>
  11.  
     
  12.  
     
  13.  
     
  14.  
    <root level="INFO">
  15.  
    <appender-ref ref="STDOUT"/>
  16.  
    </root>
  17.  
     
  18.  
    </configuration>

注意这个<pattern/>中配置了输出 requestId

4. 最后看下效果,下面加粗的即为requestId
[2017-12-14 16:08:45,677] [INFO ] - [http-nio-8080-exec-1] [a08f86cd-6743-48ce-816a-f5ee61b802b8] 

在SpringBoot项目中添加logback的MDC的更多相关文章

  1. 在SpringBoot项目中添加SpringMVC拦截器

    1.认识拦截器 SpringMVC的拦截器(Interceptor)不是Filer,同样可以实现请求的预处理.后处理.使用拦截器仅需要两个步骤 实现拦截器 注册拦截器 1.1实现拦截器 实现拦截器可以 ...

  2. 在SpringBoot中添加Logback日志处理

    前言 SpringBoot项目中在官方文档中说明,默认已经依赖了一些日志框架.而其中推荐使用的就是Logback,所以这一次我将在我的模版中加入Logback日志的配置,说明一下,SpringBoot ...

  3. SpringBoot12 QueryDSL01之QueryDSL介绍、springBoot项目中集成QueryDSL

    1 QueryDSL介绍 1.1 背景 QueryDSL的诞生解决了HQL查询类型安全方面的缺陷:HQL查询的扩展需要用字符串拼接的方式进行,这往往会导致代码的阅读困难:通过字符串对域类型和属性的不安 ...

  4. JAVA项目中引用Logback的方法

    一.简介 本文主要讲JAVA项目中引入Logback的方法. 二.解决 1.引入依赖. <!--Begin LogBack Log--> <!-- https://mvnreposi ...

  5. 五分钟后,你将学会在SpringBoot项目中如何集成CAT调用链

    买买买结算系统 一年一度的双十一购物狂欢节就要到了,又到剁手党们开始表演的时刻了.当我们把种草很久的商品放入购物车以后,点击"结算"按钮时,就来到了买买买必不可少的结算页面了.让我 ...

  6. SpringBoot项目中遇到的BUG

    1.启动项目的时候报错 1.Error starting ApplicationContext. To display the auto-configuration report re-run you ...

  7. springboot项目中接口入参的简单校验

    .katex { display: block; text-align: center; white-space: nowrap; } .katex-display > .katex > ...

  8. Spring-Boot项目中配置redis注解缓存

    Spring-Boot项目中配置redis注解缓存 在pom中添加redis缓存支持依赖 <dependency> <groupId>org.springframework.b ...

  9. Entity Framework 的小实例:在项目中添加一个实体类,并做插入操作

    Entity Framework 的小实例:在项目中添加一个实体类,并做插入操作 1>. 创建一个控制台程序2>. 添加一个 ADO.NET实体数据模型,选择对应的数据库与表(Studen ...

随机推荐

  1. netty的好处

    netty作为一个高性能的异步通信框架,它到底有哪些好处了,又用到哪些基础技术呢? 1.使用ServerBootstrap 作为netty服务端的启动辅助类,并且在创建ServerBootstrap时 ...

  2. Gerrit系统框架介绍

    Gerrit目录介绍 转自:https://blog.csdn.net/tanshizhen119/article/details/79889242 先上图 bin/ : 主要是放gerrit.sh启 ...

  3. 小程序应用的Python服务器部署高配,依然是腾讯云秒杀阿里云!

    上一篇文章,“小程序创业最低配置部署,腾讯云折扣秒杀阿里云!”介绍了小程序项目启动时的最低配置服务器选择,但当项目良好发展时,还是要把服务器配置调整到标准水平,承受住日益增长的流量访问. 随着Pyth ...

  4. Odoo / PS Cloud12版本中,产品变体功能如何使用

    场景: 产品:陶瓷马克杯 产品颜色变体:红色.蓝色.白色 产品尺寸变体:10CM.12CM.15CM 每个变体都有不同价格维度 odoo / PS Cloud 专业实施开发 EMAIL:1715860 ...

  5. 解决SVN Cleanup错误: Failed to run the WC DB work queue associated with

    [内容来源自https://www.cnblogs.com/ANCAN-RAY/p/8961832.html] 在svn本地目录更新文件夹时,更新失败. 然后svn提示我,让我cleanup一下,于是 ...

  6. iBatis第二章:搭建一个简单的iBatis开发环境

    使用 iBatis 框架开发的基本步骤如下:1.新建项目(iBatis是持久层框架,可以运用到java工程或者web工程都可以) 这里我们建立一个 web 工程测试. 2.导入相应的框架 jar 包 ...

  7. sql 排序函数ROW_NUMBER分页返回数据

    分页从数据库返回一张表的某些条数据 假设我需要查询 系统表 sys.all_columns中的数据,每次查询10条 第一次查询第1-10条数据 第二次查询第11-20条数据 第三次查询第21-30条数 ...

  8. 什么是validationQuery

    validationQuery是用来验证数据库连接的查询语句,这个查询语句必须是至少返回一条数据的SELECT语句.每种数据库都有各自的验证语句,下表中收集了几种常见数据库的validationQue ...

  9. idea中Springcloud同时运行多个模块、微服务

    idea中有个窗口叫做 Run DashBoard 在这里可以管理多个模块的启停,这个面板一般情况下是关闭的打开Run DashBoard面板 在工程的.idea中找到workspace.xml,并找 ...

  10. WEB框架-Django框架学习(二)- 模型层

    今日份整理为模型层 1.ORM简介 MVC或者MVC框架中包括一个重要的部分,就是ORM,它实现了数据模型与数据库的解耦,即数据模型的设计不需要依赖于特定的数据库,通过简单的配置就可以轻松更换数据库, ...