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