MDC是什么?
第一次接觸MDC,很蒙圈。看看導入的包import org.slf4j.Logger;import org.slf4j.LoggerFactory;import org.slf4j.MDC;它顯然和日志管理有關。
slf4j常用的日志接口有哪些?trace、debug、info、warn、error,再加上MDC.
最常見的日志管理會采用這種方式:
private static final Logger log = LoggerFactory.getLogger(類名.class);
log.info();
log.debug();
log.trace();
MDC.put()方法提供了日志輸出功能,通過log4j2.xml的layout配置%X{ }即可獲得日志,這種方式非常靈活,
允許用戶對任何對象進行日志管理。
怎么為應用配置日志管理
日志的輸出格式:
<property name="PATTERN">
%X{logId},[%-5level],%d{yyyy-MM-dd HH:mm:ss.SSS},%t,%c{1}: %msg%n
</property>
解析:
- %X{logId}----針對MDC.put("", "")方法。
- [%-5level]----日志的級別
- %d{yyyy-MM-dd HH:mm:ss.SSS}-----時間格式化
- %t ----- 線程
- %c{1} --- 類名
- %msg --- 消息
- %n ------換行
看配置文件
<?xml version="1.0" encoding="UTF-8"?> <!-- status="OFF",可以去掉,它的含義為是否記錄log4j2本身的event信息,默認是OFF --> <configuration> <properties> <!-- 文件輸出格式 --> <property name="PATTERN"> %X{logId},[%-5level],%d{yyyy-MM-dd HH:mm:ss.SSS},%t,%c{1}: %msg%n </property> <!-- 日志根路徑 --> <property name="BASE_PATH"> /applog/xxxlog </property> <!-- 應用名 --> <property name="APP_NAME"> xxx-core </property> <!-- 日志文件名 --> <property name="LOG_FILE_NAME"> ${BASE_PATH}/${APP_NAME}.log </property> <!-- 滾動日志文件生成規則 --> <property name="LOG_FILE_PATTERN"> ${BASE_PATH}/${APP_NAME}_%d{yyyyMMddHHmm}-%i.log </property> </properties> <!-- xx報文日志級別 --> <DynamicThresholdFilter key="traceOpen" defaultThreshold="ERROR" onMatch="ACCEPT" onMismatch="NEUTRAL"> <KeyValuePair key="yes" value="trace" /> </DynamicThresholdFilter> <!-- 日志輸出定義 --> <appenders> <!-- 滾動日志 --> <RollingFile name="rollingFileLog" filename="${LOG_FILE_NAME}" filePattern="${LOG_FILE_PATTERN}" append="true"> <Filters> 過濾掉不符合日志級別的日志 <!-- <ThresholdFilter level="error" onMatch="DENY" onMismatch="NEUTRAL" /> --> 只輸出level及以上級別的信息(onMatch),其他的直接拒絕(onMismatch) <!-- <ThresholdFilter level="trace" onMatch="ACCEPT" onMismatch="DENY" /> --> </Filters> 輸出日志的格式 <PatternLayout pattern="${PATTERN}" /> <Policies> <TimeBasedTriggeringPolicy /> <SizeBasedTriggeringPolicy size="20 MB" /> </Policies> 滾動日志的策略 <DefaultRolloverStrategy max="50"> <Delete basePath="${BASE_PATH}/" maxDepth="2"> <IfFileName glob="${APP_NAME}_*.log" /> <!--! 這里的age必須和filePattern協調, 后者是精確到HH, 這里就要寫成xH, xd就不起作用 另外, 數字最好>2, 否則可能造成刪除的時候, 最近的文件還處於被占用狀態,導致刪除不成功!--> <!--7天--> <IfLastModified age="7d" /> <IfAny> <IfAccumulatedFileSize exceeds="2 GB" /> <IfAccumulatedFileCount exceeds="100" /> </IfAny> </Delete> </DefaultRolloverStrategy> </RollingFile> <!-- 控制台 --> <Console name="console" target="SYSTEM_OUT"> <PatternLayout pattern="${PATTERN}" /> </Console> </appenders> <!-- 日志對象定義 --> <loggers> <!-- xx日志 --> <logger name="CoreframeInteractiveLogger" level="info" additivity="true"> <AppenderRef ref="interactiveAppender" /> </logger> <!-- xx日志 --> <logger name="CoreframeServiceMetricsLogger" level="info" additivity="true"> <AppenderRef ref="serviceMetricsAppender" /> </logger> <!-- 服務框架 --> <logger name="coreframe" level="info" /> <!-- 應用處理日志 --> <logger name="Service" level="debug" /> <logger name="" level="debug" /> <!-- 測試日志 --> <logger name="test" level="trace" /> <logger name="" level="trace" /> <root level="info"> <AppenderRef ref="console" /> <AppenderRef ref="rollingFileLog" /> </root> </loggers> </configuration>