需求如下

  • DEV 用 Console 输出,PROD 用日志文件
  • 日志文件滚动保存
  • 日志链路 ID

准备

application.yml

logging:  
  config: classpath:logback-spring.xml

logback-spring.xml

<?xml version="1.0" encoding="UTF-8"?>  
<configuration scan="true">  
  
    <!-- 配置彩色日志输出 -->
    <conversionRule conversionWord="clr" converterClass="org.springframework.boot.logging.logback.ColorConverter" />  
    <conversionRule conversionWord="wex" converterClass="org.springframework.boot.logging.logback.WhitespaceThrowableProxyConverter" />  
    <conversionRule conversionWord="wEx" converterClass="org.springframework.boot.logging.logback.ExtendedWhitespaceThrowableProxyConverter" />  
    <property name="CONSOLE_LOG_PATTERN" value="${CONSOLE_LOG_PATTERN:-%clr(%d{yyyy-MM-dd HH:mm:ss.SSS}){faint} %clr(${LOG_LEVEL_PATTERN:-%5p}) %clr(${PID:- }){magenta} %clr(---){faint} %clr([%15.15t]){faint} %clr(%-40.40logger{39}){cyan} %clr(:){faint} %m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}}"/>  
  
    <!-- Console 输出的相关配置 -->
    <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">  
        <encoder>  
            <pattern>${CONSOLE_LOG_PATTERN}</pattern>  
            <charset>utf8</charset>  
        </encoder>   
        <filter class="com.wewecoin.configuration.LoggerConfiguration"/>  
    </appender>  
  
    <appender name="LOG_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">  
        <!-- 日志文件路径 -->
        <file>/root/log/app.log</file>  
        <encoder>  
            <!-- 打印格式,加入 requestId -->
            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS,GMT+8} [%X{requestId}] %-5level%logger{50} - %msg%n</pattern>  
            <charset>UTF-8</charset>  
        </encoder>  
        <!-- 滚动文件配置 -->
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">  
            <fileNamePattern>${log.path}/app-%d{yyyy-MM-dd}-%i.log</fileNamePattern>  
            <MaxHistory>365</MaxHistory>  
            <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">  
                <maxFileSize>100MB</maxFileSize>  
            </timeBasedFileNamingAndTriggeringPolicy>  
        </rollingPolicy>  
    </appender>  
  
    <!-- 不同 Profile 下运行不同的处理器 -->
    <springProfile name="dev">  
        <root level="INFO">  
            <appender-ref ref="CONSOLE" />  
        </root>  
    </springProfile>  
    <springProfile name="prod">  
        <root level="INFO">  
            <appender-ref ref="LOG_FILE" />  
        </root>  
    </springProfile>  
  
</configuration>

配置链路 ID

创建类 LoggerConfiguration 实现 Filter

@Component  
public class LoggerConfiguration implements Filter {

    @Override  
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws ServletException, IOException {  
        // 这里的 ID 随便生成,也可以用 UUID
        MDC.put("requestId", String.valueOf(IdUtil.getSnowflakeNextId()));  
        try {  
            chain.doFilter(request, response);  
        } finally {  
            MDC.clear();  
        }  
    }

}