摘要:该实例主要是基于slf4j
的MDC进行实现tranceId
的上下文保存,当然也可以自己定义ThreadLocal
进行保存,方式一直,对于跨服务的调用也可以把tranceId
放在请求头中,接收方复用该tranceId
基于Filter
的实现
拦截所有的请求
@WebFilter(filterName = "traceIdFilter", urlPatterns = "/*")
@Component
public class TraceFilter extends OncePerRequestFilter {
@Override
protected void doFilterInternal(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, FilterChain filterChain) throws ServletException, IOException {
MDC.put("tranceId", UUID.randomUUID().toString());
filterChain.doFilter(httpServletRequest,httpServletResponse);
}
}
logback.xml
配置
<!-- Logback configuration. See http://logback.qos.ch/manual/index.html -->
<configuration>
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>%date{HH:mm:ss.SSS} | %X{tranceId} | [%thread] %-5level %logger{36} - %msg%n
</pattern>
</encoder>
</appender>
<logger name="org.springframework.web" level="INFO"/>
<logger name="com.huzhihui" level="INFO"/>
<!-- 指定项目可输出的最低级别日志 -->
<root level="INFO">
<appender-ref ref="STDOUT"/>
</root>
</configuration>
定义控制器
@Slf4j
@RestController
public class CommonController {
@RequestMapping(value = "i18n")
public Object i18n(){
log.info("ttts");
log.info("bafgsdaf");
return message;
}
}
完整应用日志配置
application.yml
spring:
application:
name: env
logging:
file:
path: /var/log/${spring.application.name}
logback-spring.xml
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<include resource="org/springframework/boot/logging/logback/defaults.xml" />
<springProperty name="APPLICATION_NAME" source="spring.application.name" />
<property name="LOG_FILE" value="${LOG_FILE:-${LOG_PATH:-${LOG_TEMP:-${java.io.tmpdir:-/tmp}}}/spring.log}" />
<property name="CONSOLE_LOG_PATTERN" value="[${APPLICATION_NAME}] %clr(%d{${LOG_DATEFORMAT_PATTERN:-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}"/>
<property name="FILE_LOG_PATTERN" value="[${APPLICATION_NAME}] %d{${LOG_DATEFORMAT_PATTERN:-yyyy-MM-dd HH:mm:ss.SSS}} ${LOG_LEVEL_PATTERN:-%5p} ${PID:- } --- [%t] %-40.40logger{39} : %m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}"/>
<property name="LOG_CHARSET" value="UTF-8"/>
<!-- 控制台输出 -->
<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>${CONSOLE_LOG_PATTERN}</pattern>
<charset>${LOG_CHARSET}</charset>
</encoder>
</appender>
<appender name="FILE-LOG" class="ch.qos.logback.core.rolling.RollingFileAppender">
<encoder>
<pattern>${FILE_LOG_PATTERN}</pattern>
<charset>${LOG_CHARSET}</charset>
</encoder>
<file>${LOG_FILE}</file>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>${LOG_FILE}.%d{yyyy-MM-dd}.%i</fileNamePattern>
<timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<maxFileSize>20MB</maxFileSize>
</timeBasedFileNamingAndTriggeringPolicy>
<maxHistory>7</maxHistory>
<totalSizeCap>1GB</totalSizeCap>
</rollingPolicy>
</appender>
<!--异步输出到文件-->
<appender name="FILE" class="ch.qos.logback.classic.AsyncAppender">
<!--不丢弃日志 默认的,如果队列的80%已满-->
<discardingThreshold>0</discardingThreshold>
<!--更改默认的队列深度,该值会影响性能,默认256-->
<queueSize>512</queueSize>
<!--添加附加的appender,最多只能添加一个-->
<appender-ref ref="FILE-LOG" />
</appender>
<springProfile name="local">
<root level="INFO">
<appender-ref ref="CONSOLE" />
</root>
</springProfile>
<springProfile name="prod">
<root level="INFO">
<appender-ref ref="CONSOLE" />
<appender-ref ref="FILE" />
</root>
</springProfile>
<springProfile name="default">
<root level="INFO">
<appender-ref ref="CONSOLE" />
<appender-ref ref="FILE" />
</root>
</springProfile>
<!-- 动态修改日志等级 -->
<jmxConfigurator />
</configuration>