前言:
MDC(全称 Mapped Diagnostic Context,映射调试上下文),即将一些运行时的上下文数据通过logback打印出来,是一种方便在多线程条件下记录日志的功能。可以实现根据运行时的上下文数据,将日志保存到不同的文件中,所以这里我们可以采用拦截器等方式,将所有请求MDC存入ip,并配置xml以达到我们的目的
正文:
第一步:创建拦截器与注册器
1、创建WebLogMdcHandlerInterceptor类并继承HandlerInterceptorAdapter,需先引入hutool工具包
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
<version>5.8.4</version>
</dependency>
import cn.hutool.extra.servlet.ServletUtil;
import org.slf4j.MDC;
import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* @author wfeil211@foxmail.com
* @date 2022-7-22 10:09:42
*/
public class WebLogMdcHandlerInterceptor extends HandlerInterceptorAdapter {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
MDC.put("ip", ServletUtil.getClientIP(request));
return true;
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response,
Object handler, Exception ex) throws Exception {
MDC.clear();
}
@Override
public void afterConcurrentHandlingStarted(HttpServletRequest request,
HttpServletResponse response, Object handler) throws Exception {
preHandle(request, response, handler);
}
}
2、创建WebMvcConfig实现WebMvcConfigurer
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
/**
* @author wfeil211@foxmail.com
* @date 2022-7-22 10:09:42
*/
@Configuration
@EnableWebMvc
public class WebMvcConfig implements WebMvcConfigurer {
@Override
public void addInterceptors(InterceptorRegistry registry) {
// MDC
WebLogMdcHandlerInterceptor mdcInterceptor = new WebLogMdcHandlerInterceptor();
registry.addInterceptor(mdcInterceptor);
}
}
第二步:修改logback-spring.xml文件
将对应要处理的日志appender标签内容使其包裹在内,修改如下,其中ip为我们上步MDC存入
<appender name="info" class="ch.qos.logback.classic.sift.SiftingAppender">
<discriminator>
<key>ip</key>
<defaultValue>localhost</defaultValue>
</discriminator>
<sift>
<appender name="${ip}-file_info" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${log.path}/${ip}-info.log</file>
<!-- 循环政策:基于时间创建日志文件 -->
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!-- 日志文件名格式 -->
<fileNamePattern>${log.path}/${ip}-info.%d{yyyy-MM-dd}.log</fileNamePattern>
<!-- 日志最大的历史 15天 -->
<maxHistory>15</maxHistory>
</rollingPolicy>
<encoder>
<pattern>${log.pattern}</pattern>
</encoder>
</appender>
</sift>
</appender>
效果图: