前面我们介绍plumlog的时候,可以看到在接口里面设置了webmvc,如果是定时器的话,则还要在单独的地方设置loggerhelper,那有没有更简单的方法呢?其实是有的,本文我们来介绍下。
更简单的方式就是设置一个全局的filter,然后在打印日志的时候看有没有traceid,如果没有就创建,如果有就沿用,所以下面我们来演示一下:
前置条件:
使用本文案例的时候,需要把接口的webmvc配置的filter,还有写的tokenfilter,还有写的loggerhelper全删除掉,然后进行下面的操作。
一、定义filter
这里我们写个全局的filter实现类即可,下面是示例代码:
import ch.qos.logback.classic.Level; import ch.qos.logback.classic.Logger; import ch.qos.logback.classic.turbo.TurboFilter; import ch.qos.logback.core.spi.FilterReply; import com.plumelog.core.TraceId; import org.slf4j.MDC; import java.util.UUID; /** * 自动traceId生成的TurboFilter * 当日志输出时如果没有traceId,则自动生成一个 */ public class TraceIdTurboFilter extends TurboFilter { // 定义MDC中用于存储plumelog追踪ID的键名 private static final String PLUME_LOG_TRACE_ID = "plume_log_trace_id"; // 重写TurboFilter的decide方法,该方法在日志事件处理前被调用 @Override public FilterReply decide(Marker marker, Logger logger, Level level, String format, Object[] params, Throwable t) { // 从当前线程的MDC中获取traceId值 String traceId = MDC.get(PLUME_LOG_TRACE_ID); // 检查当前线程的MDC中是否有traceId if (traceId == null || traceId.trim().isEmpty()) { // 如果没有traceId,则生成一个新的 traceId = generateTraceId(); // 将生成的traceId放入MDC中,供后续日志输出使用 MDC.put(PLUME_LOG_TRACE_ID, traceId); // 同时将traceId设置到plumelog的TraceId中,确保plumelog能正确追踪 TraceId.logTraceID.set(traceId); } // 返回NEUTRAL表示继续处理日志事件,不做任何过滤 return FilterReply.NEUTRAL; } // 私有方法,用于生成唯一的traceId private String generateTraceId() { // 使用UUID生成一个全局唯一标识符,移除其中的连字符,并取前16位作为traceId return UUID.randomUUID().toString().replace("-", "").substring(0, 16); } }
二、修改spring-logback.xml文件
这里我们主要修改的内容是在这个xml文件里面添加上一份前面的过滤器,添加一行代码即可:
<!-- 自动traceId生成TurboFilter --> <turboFilter class="com.mybatis.demo.TraceIdTurboFilter" />
其他不用做任何变动,这里要把class类修改为自己的包信息,最后贴一个我们的spring-logback.xml的完整代码:
<?xml version="1.0" encoding="UTF-8"?>
<configuration debug="false">
<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="TRACE_PATTERN" value="[%X{traceId}] "/>
<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} ${TRACE_PATTERN}%clr(%-40.40logger{39}){cyan} %clr(:){faint} %m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}}"/>
<!-- 环境配置 -->
<springProperty scope="context" name="plumelog.appName" source="plumelog.appName"/>
<springProperty scope="context" name="plumelog.redisHost" source="plumelog.redisHost"/>
<springProperty scope="context" name="plumelog.redisPort" source="plumelog.redisPort"/>
<springProperty scope="context" name="plumelog.redisAuth" source="plumelog.redisAuth"/>
<springProperty scope="context" name="plumelog.redisDb" source="plumelog.redisDb"/>
<springProperty scope="context" name="plumelog.env" source="spring.profiles.active"/>
<!-- 自动traceId生成TurboFilter -->
<turboFilter class="com.million.mes.basic.logic.utils.TraceIdTurboFilter" />
<!--开发环境配置 -->
<springProfile name="dev">
<!--输出到控制台,开发环境使用 -->
<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<Pattern>${CONSOLE_LOG_PATTERN}</Pattern>
<charset>UTF-8</charset>
</encoder>
</appender>
<!-- 输出到文件,开发环境使用 -->
<appender name="file" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>logs/log-dev.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<FileNamePattern>logs/log--dev.%d{yyyy-MM-dd}.log</FileNamePattern>
<MaxHistory>30</MaxHistory>
<TotalSizeCap>1GB</TotalSizeCap>
</rollingPolicy>
<encoder>
<Pattern>${CONSOLE_LOG_PATTERN}</Pattern>
<charset>UTF-8</charset>
</encoder>
</appender>
<!-- Plumelog日志输出,开发环境可选 -->
<appender name="plumelog" class="com.plumelog.logback.appender.RedisAppender">
<appName>${plumelog.appName}</appName>
<redisHost>${plumelog.redisHost}</redisHost>
<redisAuth>${plumelog.redisAuth}</redisAuth>
<redisDb>${plumelog.redisDb}</redisDb>
<env>${plumelog.env}</env>
<!-- 启用追踪码 -->
<expand>traceId</expand>
</appender>
<!-- 配置日志输出级别 -->
<root level="INFO">
<appender-ref ref="CONSOLE"/>
<appender-ref ref="file"/>
<appender-ref ref="plumelog"/>
</root>
</springProfile>
<!--测试环境配置 -->
<springProfile name="test">
<!--输出到控制台,测试环境使用 -->
<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<Pattern>${CONSOLE_LOG_PATTERN}</Pattern>
<charset>UTF-8</charset>
</encoder>
</appender>
<!-- 输出到文件,测试环境使用 -->
<appender name="file" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>logs/log-test.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<FileNamePattern>logs/log-test.%d{yyyy-MM-dd}.log</FileNamePattern>
<MaxHistory>30</MaxHistory>
<TotalSizeCap>1GB</TotalSizeCap>
</rollingPolicy>
<encoder>
<Pattern>${CONSOLE_LOG_PATTERN}</Pattern>
<charset>UTF-8</charset>
</encoder>
</appender>
<!-- Plumelog日志输出,测试环境 -->
<appender name="plumelog" class="com.plumelog.logback.appender.RedisAppender">
<appName>${plumelog.appName}</appName>
<redisHost>${plumelog.redisHost}</redisHost>
<redisAuth>${plumelog.redisAuth}</redisAuth>
<redisDb>${plumelog.redisDb}</redisDb>
<env>${plumelog.env}</env>
<!-- 启用追踪码 -->
<expand>traceId</expand>
</appender>
<!-- 配置日志输出级别 -->
<root level="INFO">
<appender-ref ref="CONSOLE"/>
<appender-ref ref="file"/>
<appender-ref ref="plumelog"/>
</root>
</springProfile>
<!--生产环境配置 -->
<springProfile name="prod">
<!-- 输出到文件,生产环境不输出到控制台 -->
<appender name="file" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>logs/log-prod.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<FileNamePattern>logs/log-prod.%d{yyyy-MM-dd}.log</FileNamePattern>
<MaxHistory>90</MaxHistory>
<TotalSizeCap>10GB</TotalSizeCap>
</rollingPolicy>
<encoder>
<Pattern>${CONSOLE_LOG_PATTERN}</Pattern>
<charset>UTF-8</charset>
</encoder>
</appender>
<!-- Plumelog日志输出,生产环境必须 -->
<appender name="plumelog" class="com.plumelog.logback.appender.RedisAppender">
<appName>${plumelog.appName}</appName>
<redisHost>${plumelog.redisHost}</redisHost>
<redisAuth>${plumelog.redisAuth}</redisAuth>
<redisDb>${plumelog.redisDb}</redisDb>
<env>${plumelog.env}</env>
<!-- 启用追踪码 -->
<expand>traceId</expand>
</appender>
<!-- 配置日志输出级别,生产环境通常只记录INFO及以上级别 -->
<root level="INFO">
<appender-ref ref="file"/>
<appender-ref ref="plumelog"/>
</root>
</springProfile>
<!-- 默认配置,如果没有指定profile -->
<springProfile name="!dev && !test && !prod">
<!--输出到控制台,默认使用 -->
<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<Pattern>${CONSOLE_LOG_PATTERN}</Pattern>
<charset>UTF-8</charset>
</encoder>
</appender>
<!-- 输出到文件,默认使用 -->
<appender name="file" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>logs/log-default.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<FileNamePattern>logs/log-default.%d{yyyy-MM-dd}.log</FileNamePattern>
<MaxHistory>30</MaxHistory>
<TotalSizeCap>1GB</TotalSizeCap>
</rollingPolicy>
<encoder>
<Pattern>${CONSOLE_LOG_PATTERN}</Pattern>
<charset>UTF-8</charset>
</encoder>
</appender>
<!-- Plumelog日志输出 -->
<appender name="plumelog" class="com.plumelog.logback.appender.RedisAppender">
<appName>${plumelog.appName}</appName>
<redisHost>${plumelog.redisHost}</redisHost>
<redisPort>${plumelog.redisPort}</redisPort>
<redisAuth>${plumelog.redisAuth}</redisAuth>
<redisDb>${plumelog.redisDb}</redisDb>
<env>${plumelog.env}</env>
<!-- 启用追踪码 -->
<expand>traceId</expand>
</appender>
<!-- 配置日志输出级别 -->
<root level="INFO">
<appender-ref ref="CONSOLE"/>
<appender-ref ref="file"/>
<appender-ref ref="plumelog"/>
</root>
</springProfile>
</configuration>三、测试
剩下就是测试了,把项目启动起来,可以看到连启动日志都自动添加上了traceid:


还没有评论,来说两句吧...