如果你不了解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,请求路径......等等,业务需要的参数.