先看下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. Ubuntu16.04安装opencv-3.4.2

    原文链接: https://m.oldpan.me/archives/ubuntu-install-opencv-from-source 第一步:更新我们的系统 sudo apt-get update ...

  2. POJ1006: 中国剩余定理的完美演绎

    POJ1006: 中国剩余定理的完美演绎   问题描述 人自出生起就有体力,情感和智力三个生理周期,分别为23,28和33天.一个周期内有一天为峰值,在这一天,人在对应的方面(体力,情感或智力)表现最 ...

  3. 【译】.NET 跨平台界面框架和为什么你首先要考虑再三

    现在用 C# 来开发跨平台应用已经有很成熟的方案,即共用非界面代码,而每个操作系统搭配特定的用户界面代码.这个方案的好处是可以直接使用操作系统原生的控件和第三方控件,还能够和操作系统深度集成. 这里的 ...

  4. element表格添加查看操作

    表格代码:黄色部分关键代码 首先看效果: <el-table :data="tableData" border height="480" style=&q ...

  5. js当地天气调用

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  6. CRM实施失败?请注意这6大问题及对策!

    据Gartner调查显示:约50%的CRM项目不能达到客户期望.这一点与很多其他的IT项目状况非常类似,大多出于管理问题,供应商服务能力,项目执行不善等. 另据一个在线CRM论坛调查其失败的原因:67 ...

  7. Android Studio教程10-Intent的详细使用

    目录 1. Intent启动器 1.1. Intent的用途 1. 启动Activity 3. 传递广播 1.2. Intent类型 1.显示Intent 2.隐式Intent 2. 构建Intent ...

  8. Numpy库的学习(二)

    今天来继续学习一下Numpy库的使用 接着昨天的内容继续 在Numpy中,我们如果想要进行一个判断使用“==” 我们来看下面的代码 vector = np.array([5,10,15,20,25]) ...

  9. Bootstrap table 行编辑导航

    /*开启表格编辑方向键导航 方向键(←): VK_LEFT (37) 方向键(↑): VK_UP (38) 方向键(→): VK_RIGHT (39) 方向键(↓): VK_DOWN (40) */ ...

  10. java 易错选择题 编辑中

    1 System.out.println(int(a+b)); 编译错误  应该是(int)(a+b) 2 String s="john"+3; 是正确的,结果就是 john3 3 ...