logback输出日志区分所属线程:方便运维排查问题

Posted 我爱看明朝

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了logback输出日志区分所属线程:方便运维排查问题相关的知识,希望对你有一定的参考价值。

logback输出日志区分所属线程:方便运维排查问题

背景

业务上,当同一个请求日志很多,我们需要查看,某一次请求的上下文日志信息,怎么办?

先来看看我们的请求过程:

不同用户发起同一个请求 -----> web容器(tomcat) -----> 从线程池拿到一个线程,处理具体一个用户的请求 -----> 我们的业务代码,输出日志

那就在每行日志输出上,增加代表这个线程,会话的信息,方案如下:

1. 输出线程id
2. 输出自己生成的随机字符,如uuid

先来看第一种方案: 线程是从线程池拿到,id是可能会重复,不符合我们的需求。那么只有第二中方案符合我们的需求了。

输出自己生成的随机字符

slf4j为我们提供了MCD工具类,可以让我们放一些变量值到日志中输出。

自定义拦截器,设置MCD

生成每次请求的唯一标识

/**
 * @author xuelongjiang
 * @description logback拦截器
 **/
public class LogInterceptor implements HandlerInterceptor 

    public static final String REQUESTUUID = "REQUEST_UUID";

    @Override
    public boolean preHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o) throws Exception 
        String token = UUID.randomUUID().toString().replace("-", "").toUpperCase();
        MDC.put(REQUESTUUID, token);
        return true;
    

    @Override
    public void postHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse,
                           Object o, ModelAndView modelAndView) throws Exception 
        // nothing
    

    @Override
    public void afterCompletion(HttpServletRequest httpServletRequest,
                                HttpServletResponse httpServletResponse, Object o, Exception e) throws Exception 
        MDC.remove(REQUESTUUID);
    


HandlerInterceptor业务处理器拦截器,给我们提供了三个方法:

1.preHandle:在业务处理器请求之前被调用。预处理可以可以进行编码控制、安全控制、权限校验等
2.postHandle:在业务处理器处理请求完成之后,在生成视图之前执行。
3.afterCompletion:在DispatcherServlet完全处理完请求后被调用,可用于清理资源等。

设置拦截所有请求

@Configuration
public class WebAppconfigure implements WebMvcConfigurer 

    @Override
    public void addInterceptors(InterceptorRegistry interceptorRegistry) 
        interceptorRegistry.addInterceptor(new LogInterceptor()).addPathPatterns("/**");
        return;
    


logback日志输出增加请求唯一标识

 <encoder>
            <pattern>
				%dateyyyy-MM-dd HH:mm:ss.SSS | %thread | %logger56 | %-5level | %XHOST_IP | %XUSER_NAME | %XREQUEST_UUID | %XREQUEST_URL | %msg%n
            </pattern>
        </encoder>

参考

https://blog.csdn.net/zhibo_lv/article/details/81699360

以上是关于logback输出日志区分所属线程:方便运维排查问题的主要内容,如果未能解决你的问题,请参考以下文章

利用logback+slf4j日志采集整合到SBA

基于Slf4j的MDC实现日志链路串联

基于Slf4j的MDC实现日志链路串联

springboot 使用logback按业务进行日志分离

filebeat 多个日志输出到logstash后怎么区分

log4j并发打印日志导致线程Block问题排查记录