Le journal de sortie de reconnexion distingue le thread auquel il appartient : pour faciliter le dépannage des problèmes d'exploitation et de maintenance

Le journal de sortie de reconnexion distingue le thread auquel il appartient : pour faciliter le dépannage des problèmes d'exploitation et de maintenance

arrière-plan

En entreprise, lorsqu'il existe de nombreux journaux pour la même requête, nous devons vérifier les informations du journal contextuel d'une certaine requête. Que devons-nous faire ?

Jetons d'abord un coup d'œil à notre processus de demande :

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

Ajoutez ensuite des informations représentant ce thread et cette session à chaque ligne de sortie du journal. Le plan est le suivant :

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

Regardons d'abord la première solution : le thread est obtenu à partir du pool de threads, et l'ID peut être répété, ce qui ne répond pas à nos besoins. Alors seule la deuxième solution répond à nos besoins.

Afficher des caractères aléatoires générés par vous-même

slf4j nous fournit la classe d'outils MCD, qui nous permet de mettre certaines valeurs variables dans le journal pour la sortie.

Personnaliser l'intercepteur, définir MCD

Générer un identifiant unique pour chaque requête

/**
 * @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);
    }
}

L'intercepteur de processeur métier HandlerInterceptor nous propose trois méthodes :

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

Configurer l'interception de toutes les demandes

@Configuration
public class WebAppconfigure implements WebMvcConfigurer {
    
    

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

La sortie du journal de connexion ajoute un identifiant unique à la demande

 <encoder>
            <pattern>
				%date{yyyy-MM-dd HH:mm:ss.SSS} | %thread | %logger{56} | %-5level | %X{HOST_IP} | %X{USER_NAME} | %X{REQUEST_UUID} | %X{REQUEST_URL} | %msg%n
            </pattern>
        </encoder>

référence

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

Je suppose que tu aimes

Origine blog.csdn.net/u013565163/article/details/128498637
conseillé
Classement