開發(fā)中,為了方便日志跟蹤凤藏,我們可能會需要對日志文件進行分離奸忽,比如按模塊分離,業(yè)務(wù)分離等等揖庄,方便上線后對問題進行跟蹤定位栗菜。
對于模塊間分離常常比較簡單,可以直接需要包路徑匹配進行區(qū)分蹄梢。
但實際開發(fā)中疙筹,我們可能遇到一個問題,就是很多個業(yè)務(wù)的入口是相同的禁炒,此時無法根據(jù)包名區(qū)分而咆,但還是希望對當前消息的整個處理過程是在單獨的業(yè)務(wù)日志文件中,那么如何處理呢幕袱?暴备??
這里推薦使用MDC们豌,進行處理涯捻。
比如:在消息接收的時候,首先判斷下消息的業(yè)務(wù)類型玛痊,再將要寫入的文件名放到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擂煞,這里設(shè)置為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參數(shù)時,給出默認值custom晾捏。
mdc保存在threadLocal中蒿涎,所有當前線程整個處理都會輸出到指定的log文件中,需要需要注意一點的是惦辛,mdc一定要注意清理哦@颓铩!在使用完成之后務(wù)必進行一次clear.