首页 > 其他分享 >【Springboot之搜索日志妙招】在日志上打印请求唯一log标识

【Springboot之搜索日志妙招】在日志上打印请求唯一log标识

时间:2022-09-22 23:44:21浏览次数:80  
标签:Springboot springframework 妙招 org import 日志 com name

在每次请求中打出的每条日志中添加统一的请求唯一标识。通过搜索日志唯一标识,这样就可以非常高效
精准排查问题;例如:

2018-12-21 10:21:26.329 [http-nio-8080-exec-2] [my-server-logtag] [] INFO  org.springframework.web.servlet.DispatcherServlet - FrameworkServlet 'dispatcherServlet': initialization completed in 18 ms 
2018-12-21 10:21:26.363 [http-nio-8080-exec-2] [my-server-logtag] [aed35d43-3fa2-46e1-bb72-ce9f50c3fe4d] ERROR com.code3.modules.controller.MyController - 日志1 
2018-12-21 10:21:26.367 [http-nio-8080-exec-2] [my-server-logtag] [aed35d43-3fa2-46e1-bb72-ce9f50c3fe4d] ERROR com.code3.advice.GlobalExceptionHandler - 系统异常,{} 
com.code3.base.BusinessException: 异常信息1
    at com.code3.modules.controller.MyController.logtag(MyController.java:18)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at 

通过日志标识:aed35d43-3fa2-46e1-bb72-ce9f50c3fe4d,就可以精准定位

原创:https://www.jianshu.com/p/b74ade8bbb57

目录

  • 自定义日志标识生成拦截器
  • 使用日志标识生成拦截器
  • 演示

自定义日志标识生成拦截器LogInterceptor

package com.interceptors.logtag.interceptor;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.slf4j.MDC;
import org.springframework.stereotype.Component;
import org.springframework.util.StringUtils;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.UUID;

/**
 * <p>日志拦截器</p>
 *
 * @author zetting
 * @date 2018/8/27 11:18
 */
@Component
public class LogInterceptor extends HandlerInterceptorAdapter {
    private Logger log = LoggerFactory.getLogger(this.getClass());
    /**
     * 日志跟踪标识
     */
    private static final String TRACE_ID = "TRACE_ID";

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) {
        String traceId = UUID.randomUUID().toString();
        if (StringUtils.isEmpty(MDC.get(TRACE_ID))) {
            MDC.put(TRACE_ID, traceId);
        }
        return true;
    }

    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) {
        MDC.remove(TRACE_ID);
    }
}

使用日志标识生成拦截器

1.在WebMvc配置加上LogInterceptor

package com.interceptors.logtag.configuration;

import com.interceptors.logtag.interceptor.LogInterceptor;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

/**
 * MVC配置
 *
 * @author zet
 * @date 2018-12-21 22:30
 */
@Configuration
public class WebMvcConfiguration implements WebMvcConfigurer {
    @Autowired
    private LogInterceptor logInterceptor;

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(logInterceptor);
    }
}

2.在logback文件加上[%X{TRACE_ID}]

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <jmxConfigurator/>

    <property name="app-name" value="my-server" />
    <property name="filename" value="server" />
    <property name="module-name" value="logtag" />

    <appender name="consoleAppender" class="ch.qos.logback.core.ConsoleAppender">
        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
            <!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度%msg:日志消息,%n是换行符-->
            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] [${app-name}-${module-name}] [%X{TRACE_ID}] %highlight(%-5level) %cyan(%logger{50}) - %highlight(%msg) %n</pattern>
        </encoder>
    </appender>

    <appender name="fileAppender" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>/data/log-center/${app-name}/${module-name}/${filename}.log</file>
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <fileNamePattern>/data/log-center/${app-name}/${module-name}/${filename}.%d{yyyy-MM-dd}.log</fileNamePattern>
            <maxHistory>30</maxHistory>
        </rollingPolicy>
        <encoder>
            <pattern>[%date{ISO8601}] [%level] %logger{80} [%thread] [${app-name}-${module-name}][%X{TRACE_ID}] ${app-name}-${module-name} ==> %msg%n</pattern>
        </encoder>
    </appender>

    <root level="INFO" additivity="false">
        <appender-ref ref="fileAppender"/>
        <appender-ref ref="consoleAppender"/>
    </root>
</configuration>

演示

gitee源码:
https://gitee.com/zetting/my-gather/tree/master/springboot-interceptors-logtag

来源:https://www.jianshu.com/p/b74ade8bbb57

标签:Springboot,springframework,妙招,org,import,日志,com,name
From: https://www.cnblogs.com/konglxblog/p/16721230.html

相关文章

  • 【Springboot之切面编程】注解实现接口防刷
    本文介绍一种极简洁、灵活通用接口防刷实现方式、通过在需要防刷的方法加上@Prevent注解即可实现短信防刷;使用方式大致如下:/***测试防刷**@para......
  • 【Springboot之切面编程】注解实现敏感字段加解密
    当你的项目如果不允许明文存储敏感数据(例如身份证号、银行卡号,手机号等),那么每次存之前都要先将相关敏感字段数据加密、读取出来都要将相应敏感字段的数据解密,这种方式低效......
  • springBoot整合elk
    使用docker-compose部署elk准备docker-compose.yml文件[root@192mall-elk]#pwd/root/docker/mall-elk[root@192mall-elk]#vimdocker-compose.yml内容如下:versi......
  • SpringBoot问题集合
    WhitelabelErrorPageThisapplicationhasnoexplicitmappingfor/error,soyouareseeingthisasafallback.MonJun2414:56:23CST2019Therewasanunex......
  • SpringBoot实现自定义注解
    SpringBoot支持我们开发者能够自定义注解,从而实现一些项目中遇到的特定问题,这个功能不知道用过的小伙伴们多不多,反正我是用得不多,但是使用之后就会发现,实在是太便捷了,配合......
  • springboot中重写RedisTemplate
    1、引入jar包<!--引入redis依赖--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId>......
  • Mybatis日志
    一、mybatis日志1.关于日志作用:可以从控制台看到进程13:47:32.510[main]DEBUGorg.apache.ibatis.transaction.jdbc.JdbcTransaction-OpeningJDBCConnection1......
  • springboot在线学习系统 在线教育系统 在线课程学习平台 在线课程推荐系统 在线课程平
    ......
  • windows查看蓝屏日志 的方法
    电脑出现蓝底白字的时候,那些白字,就是一串数字加字母,就是错误代码,通过错误代码,可以判断电脑蓝屏的原因。不过这个蓝底白字显示的时间特别短,一般人记不住。其实,windows......
  • springboot前端多传参数报错、前端多传json字段报错
    Springboot多传参数导致JSONparseerror:Unrecognizedfiled...异常   默认情况下@RequestBody标注的对象必须包含前台传来的所有字段。如果没有包含前台传来的......