在SpringBoot项目中添加logback的MDC

在SpringBoot项目中添加logback的MDC

先看下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]

原文地址:https://www.cnblogs.com/bigben0123/p/10592212.html

时间: 2024-07-29 07:15:59

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

SpringBoot 项目中使用Log4j2

Log4j 系列 log4j是apache实现的一个开源日志组件 logback同样是由log4j的作者设计完成的,拥有更好的特性,用来取代log4j的一个日志框架,是slf4j的原生实现 log4j2是log4j 1.x和logback的改进版,据说采用了一些新技术(无锁异步.等等),使得日志的吞吐量.性能比log4j 1.x提高10倍,并解决了一些死锁的bug,而且配置更加简单灵活 slf4j是对所有日志框架制定的一种规范.标准.接口,并不是一个框架的具体的实现,因为接口并不能独立使用,需要

springboot项目中配置self4j

首先,声明一下,springboot项目中默认情况下已经集成了self4J + LogBack. slf4j作为一个接口定义,底层可以有很多实现框架,同时也可以支持别的日志实现或者框架打到sfl4j上.它的实现是基于不同的桥接包.slf4j作为接口定义,下面有很多种实现.实现原理是获取ILoggerFactory时执行初始化,初始化过程绑定实现对象:load出所有实现StaticLoggerBinder的类,然后获取他的单例,后面执行getLogger的时候都是调用这个单例类的方法获取对应有具体

Java实战之路(1):SpringBoot项目中使用Mybatis打印Sql语句

SpringBoot项目中使用Mybatis打印Sql语句 如题,实际项目中使用很多都会用到SpringBoot+Mybatis的经典搭配进行开发,数据库里明明有数据,可是程序运行就是查不到,此时我们在本地Debug时,需要将Mybatis的实际Sql打印出来,看看Sql与我们期望的是否一致,或者将Sql拿到数据库中直接执行,看看结果.这里简单介绍几种实战中的用法. 方法一 properties:在application.properties配置文件中增加如下配置 logging.level.c

在SSH2项目中添加JBPM4的开发环境

1.导入JBPM4开发所需的jar包,注意不要和原有的SSH2jar包冲突,启动tomcat,如果正常,则进行下一步的操作 2.将下面的JBPM4的映射文件代码,写入到hibernate.cfg.xml配置文件中: <!-- 导jpbm入映射文件 --> <mapping resource="jbpm.repository.hbm.xml" /> <mapping resource="jbpm.execution.hbm.xml" /&

向asp.net项目中添加控件AspNetPager

1.打开项目,把.dll文件放入项目中: 2.在工具栏中添加一个自定义选项卡 3.右键选项卡,点击"选择项" 4.在打开的对话框中点击:"浏览" 5.找到要添加的控件文件AspNetPager.dll,确定,添加成功啦 向asp.net项目中添加控件AspNetPager

如何在asp.net的mvc类型项目中添加webservice

先在项目中添加webservice 会产生一个asmx结尾的文件,然后在其cs中写方法. 另外在global.asax.cs里或App_Start/Route_Config中加一句 routes.IgnoreRoute("{resource}.asmx/{*pathInfo}"); 这样asmx后缀的web service就不会被mvc的routing来处理了.

Android Studio-Gradle项目中添加JNI生成文件(.so文件)

当使用gradle时,添加.so和jar包遇到报错: java.lang.UnsatisfiedLinkError: Couldn't load faceppapi: findLibrary returned null 解决办法是将build.gradle写成如下形式: apply plugin: 'android' android { compileSdkVersion 19 buildToolsVersion "19.0.0" defaultConfig { minSdkVersi

web项目中添加logger日志

在项目中添加log4j.xml文件 log4j.xml文件 <?xml version="1.0" encoding="UTF-8" ?><!DOCTYPE log4j:configuration SYSTEM "log4j.dtd"> <log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/"> <appen

springBoot项目中的static和templates文件夹

记录是为了更好的成长! 1.static文件中的页面 //这样写不能访问static中index文件夹下的index.html页面 @RequestMapping("index") public String hello() { return "/index/index"; } //这样写才能访问到 @RequestMapping("index") public String hello() { return "/index/index