开发中,为了方便日志跟踪,我们可能会需要对日志文件进行分离,比如按模块分离,业务分离等等,方便上线后对问题进行跟踪定位。
对于模块间分离常常比较简单,可以直接需要包路径匹配进行区分。
但实际开发中,我们可能遇到一个问题,就是很多个业务的入口是相同的,此时无法根据包名区分,但还是希望对当前消息的整个处理过程是在单独的业务日志文件中,那么如何处理呢???
这里推荐使用MDC,进行处理。
比如:在消息接收的时候,首先判断下消息的业务类型,再将要写入的文件名放到MDC中。
MDC.put("logFileName","xxxx");
logback配置:
<appender name="INFO" class="ch.qos.logback.classic.sift.SiftingAppender">
<discriminator>
<key>logFileName</key>
<defaultValue>custom</defaultValue>
</discriminator>
<sift>
<appender name="FILE-${logFileName}" class="ch.qos.logback.core.rolling.RollingFileAppender">
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!-- 按天回滚 daily -->
<fileNamePattern>${log_dir}/${logFileName}/log-info-${logFileName}-%d{yyyy-MM-dd}-%i.log</fileNamePattern>
<!-- 日志最大的历史 30天 -->
<maxHistory>${maxHistory}</maxHistory>
<timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<!-- maxFileSize:这是活动文件的大小,默认值是10MB,这里设置为500MB -->
<maxFileSize>${maxFileSize}</maxFileSize>
</timeBasedFileNamingAndTriggeringPolicy>
</rollingPolicy>
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度%msg:日志消息,%n是换行符-->
<pattern>%date{yyyy-MM-dd HH:mm:ss.SSS}| %C.%M | [%thread]|[%X{threadId}] |[%X{traceId}] | %highlight(%-5level) | %boldYellow(%thread) |
%boldGreen(%logger) | %msg%n
</pattern>
</encoder>
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<!-- 只打印info日志 -->
<level>INFO</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
</appender>
</sift>
</appender>
我们需要考虑当MDC中没有指定logFileName参数时,给出默认值custom。
mdc保存在threadLocal中,所有当前线程整个处理都会输出到指定的log文件中,需要需要注意一点的是,mdc一定要注意清理哦!!在使用完成之后务必进行一次clear.