如果你不了解logback,你可以先自行了解一下logback相关理论知识.
一.使用后效果:
springboot的logback默认日志如下
[127.0.0.1]-[2021-01-11 14:03:45.847]-[INFO ]-[i.r.interceptors.TestInterceptor]: ++++++++++++++++++++++++interceptor拦截器++++++++++++++++++++++++
[127.0.0.1]-[2021-01-11 14:03:46.215]-[INFO ]-[io.renren.common.utils.CoreSignUtil]: 核心得到的签名字符串前缀=================:appId=115b0ebb388f4edd3675d276074cb&cardNum=100
[2021-01-11 14:03:46.215]-[INFO ]-[io.renren.common.utils.CoreSignUtil]: 核心得到的签名=================:89af602fc85ddd4b1638623081589
这样的日志是最常见的,但是出现问题,要通过日志来操作故障时间,只能一行一行去翻日志,排查问题十分困难.
使用本文方法后你系统的日志可以是这样的
[f1400701cc3549f79793ce0bea0f9ac7]-[127.0.0.1]-[2021-01-11 14:03:45.847]-[INFO ]-[i.r.interceptors.TestInterceptor]: ++++++++++++++++++++++++interceptor拦截器++++++++++++++++++++++++
[f1400701cc3549f79793ce0bea0f9ac7]-[127.0.0.1]-[2021-01-11 14:03:46.215]-[INFO ]-[io.renren.common.utils.CoreSignUtil]: 核心得到的签名字符串前缀=================:appId=115b0ebb388f4edd3675d276074cb&cardNum=100
[f1400701cc3549f79793ce0bea0f9ac7]-[127.0.0.1]-[2021-01-11 14:03:46.215]-[INFO ]-[io.renren.common.utils.CoreSignUtil]: 核心得到的签名=================:89af602fc85ddd4b1638623081589
解释一下:
[f1400701cc3549f79793ce0bea0f9ac7] 这个为logoId,即日志的追踪ID,
[127.0.0.1] 这个是requestIp 这个是请求方ip
通过查找此ID可以将日志形成一个追踪链,你可以清楚地查看到一个请求整个执行过程.
二.xml配置logback(参考)
resources根目录下创建logback-spring.xml文件
<configuration>
<!-- 打印到控制台-->
<appender name="consoleAppender" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>
<!-- logId和requestIp和filter中要加入字段一致 -->
[%X{logId}]-[%X{requestIp}]-[%d{YYYY-MM-dd HH:mm:ss.SSS}]-[%-5level]-[%logger{36}]: %msg%n
</pattern>
</encoder>
</appender>
<!-- 打印一个完整的日志,所有级别的都在里面-->
<appender name="rollingFileAppender" class="ch.qos.logback.core.rolling.RollingFileAppender">
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<!-- rollover daily -->
<fileNamePattern>logs/test-server-log-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
<maxFileSize>10MB</maxFileSize>
<maxHistory>30</maxHistory>
<totalSizeCap>10GB</totalSizeCap>
</rollingPolicy>
<encoder>
<pattern>
<!-- logId和requestIp和filter中要加入字段一致 -->
[%X{logId}]-[%X{requestIp}]-[%d{YYYY-MM-dd HH:mm:ss.SSS}]-[%-5level]-[%logger{36}]: %msg%n
</pattern>
</encoder>
</appender>
<!-- 错误日志文件-->
<appender name="fileErrorLog" class="ch.qos.logback.core.rolling.RollingFileAppender">
<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
<level>ERROR</level>
</filter>
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<!-- rollover daily -->
<fileNamePattern>logs/test-server-error-log-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
<maxFileSize>10MB</maxFileSize>
<maxHistory>30</maxHistory>
<totalSizeCap>2GB</totalSizeCap>
</rollingPolicy>
<encoder>
<pattern>
<!-- logId和requestIp和filter中要加入字段一致 -->
[%X{logId}]-[%X{requestIp}]-[%d{YYYY-MM-dd HH:mm:ss.SSS}]-[%-5level]-[%logger{36}]: %msg%n
</pattern>
</encoder>
</appender>
<root level="INFO">
<appender-ref ref="consoleAppender"/>
<appender-ref ref="rollingFileAppender"/>
<appender-ref ref="fileErrorLog"/>
</root>
</configuration>
配置如何不生效:可以在yml文件中指定配置文件
logging:
config: classpath:logback-spring.xml
三.自定义filter并注册filter
1.自定义filter
@Slf4j
public class TestFilter implements Filter {
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
final HttpServletRequest request = (HttpServletRequest) servletRequest;
String logId = IdUtil.simpleUUID();
MDC.put("logId",logId); //日志追踪ID logId和配置在logback.xml名称一致
String ipAddr = IPUtils.getIpAddr(request);
MDC.put("requestIp",ipAddr); //ip地址 requestIp和配置在logback.xml名称一致
filterChain.doFilter(servletRequest,servletResponse);
}
}
2.注册filter(也可以用@Webfilter来注册到容器)
@Configuration
public class FilterRegisterBeanConfig {
@Bean
public FilterRegistrationBean registrationBean() {
final FilterRegistrationBean<Filter> bean = new FilterRegistrationBean<>();
bean.setFilter(new TestFilter());
bean.addUrlPatterns("/*");
bean.setName("testFilter");
bean.setOrder(10); //视具体情况而定
return bean;
}
}
完成后,经过的testfilter的请求加自动加入logId和requestId字段
可以自己建立controller和service并加日志看看效果.
可以自行按需求扩展,比如结合拦截器interceptor或AOP,可丰富日志内容,比如加入用户ID,请求路径......等等,业务需要的参数.