通常帆锋,項目當中會添加各種各樣的日志吵取,為了方便用戶請求流程的跟蹤,需要每條日志上添加用戶id锯厢,reqId等信息皮官。但是通過函數(shù)參數(shù)的方式傳遞會比較繁瑣,Slf4j為我們提供了一套簡潔的處理方案实辑。
一捺氢、通過添加Filter實例,在http請求到來時解析用戶id和reqId剪撬,并將信息保存到Slf4j的MDC中摄乒,MDC會將信息保存到當前線程的context map當中;
//創(chuàng)建過濾器,從http頭中獲取用戶id和reqId等信息
@Order(Ordered.HIGHEST_PRECEDENCE)
public class TraceFilter extends OncePerRequestFilter {
? ? @Override
? ? protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response,
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? FilterChain filterChain)throws ServletException, IOException {
? ? try {
? ? ? ? ? ? String uid = request.getHeader("UID");
? ? ? ? ? ? String device = request.getHeader("DEVICE");
? ? ? ? ? ? String reqId = request.getHeader("REQUEST-ID");
? ? ? ? ? ? MDC.put("reqId", reqId);
? ? ? ? ? ? MDC.put("uid", uid);
? ? ? ? ? ? MDC.put("device", device);
? ? ? ? ? ? filterChain.doFilter(request, response);
? ? ? ? } finally {
????????????MDC.clear();
? ? ? ? }
? ? }
}
//將過濾器添加到servlet的過濾器鏈當中
@Configuration
public class WebFilterRegistration {
@Bean
? ? public FilterRegistrationBeanregisterFilter() {
FilterRegistrationBean filterRegistrationBean =new FilterRegistrationBean();
? ? ? ? filterRegistrationBean.setFilter(new TraceFilter());
? ? ? ? filterRegistrationBean.addUrlPatterns("/*");
? ? ? ? return filterRegistrationBean;
? ? }
}
二缺狠、設置log4j的日志格式,注意萍摊,日志格式里面的名稱與放入MDC中的信息的名稱保持一致
<Console name="LogToConsole" target="SYSTEM_OUT">
? ? ? ? ? ? pattern="%d %p %c{1.} [%t] [traceId: %X{reqId} ] [userId: %X{uid} ] [device: %X{device} ] %m%n"/>
</Console>
三挤茄、在需要打印日志的類上添加@Slf4j注解,就可以使用log.info冰木,error和warn打印帶有用戶id和reqId信息的日志了穷劈。
@Slf4j
public class LogTest {
public static void main(String[] args) {
MDC.put("uid", "1111");
? ? ? ? MDC.put("reqId", "xxxxx");
? ? ? ? MDC.put("device", "2222222");
? ? ? ? log.info("==========================");
? ? ? ? System.out.println("++++++++++++++++++");
? ? }
}
日志如下:
2020-12-31 17:56:27,817 INFO c.m.s.LogTest [main] [traceId: xxxxx ] [userId: 1111 ] [device: 2222222 ] ==========================
++++++++++++++++++