1咸这、說明
logback日志框架由三部分組成:logback-core
欠肾、logback-access
关炼、logback-classic
涩笤。使用起來也很方便需要在項目目錄下增加logback.xml文件昆淡。在springboot項目锰瘸,框架已經(jīng)集成了logback(默認(rèn)的日志框架),只需要在項目resource
下配置logback.xml文件
或者logback-spring.xml
文件昂灵。這里主要記錄的是logback配置文件的內(nèi)容部分避凝。
2、logback. xml文件
在學(xué)習(xí)logback時眨补,我們需要了解設(shè)計者的思維方式管削。我們才能更好的配置出我們需要的日志策略及性能。
2.1 設(shè)計思路
(1)控制臺日志和寫入文件日志分開
日志本身是可追加寫入的撑螺,定義為追加器:appender
含思,控制臺和寫入文件日志分別有ConsleAppdender
和 FileAppender
兩個追加器處理。
(2)日志打印的內(nèi)容可以控制參數(shù)格式
打印出的日志一定是規(guī)整的实蓬,便于開發(fā)跟蹤問題茸俭。例如:問題發(fā)生的時間吊履,由于大部分程序都是多線程運行的,則需要知道每個業(yè)務(wù)請求的線程號调鬓,出問題的使用到的類名等等.
<encoder>
<pattern><![CDATA[%n[%d{yyyy-MM-dd HH:mm:ss.SSS}] [level: %p] [Thread: %t] [ Class:%c >> Method: %M:%L ]%n%p:%m%n]]></pattern>
</encoder>
(3)寫入文件中的日志不宜過大同時考慮時間跨天問題
考慮到將文件分開(可卷起Rolling
)艇炎,則使用升級的追加器RollingFileAppender
,同時分開規(guī)則(Policy
)考慮到跨天跨時間 腾窝。則在追加器中定義拆分規(guī)則:SizeAndTimeBasedRollingPolicy
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<fileNamePattern>${log.base}/%d{yyyyMMdd}/${app.name}_%d{yyyyMMdd}_%i.log.gz</fileNamePattern>
<!--文件大小-->
<maxFileSize>2GB</maxFileSize>
<!--歷史個數(shù)-->
<maxHistory>180</maxHistory>
</rollingPolicy>
(4)日志應(yīng)該可以靈活指定輸出級別
針對“ com.sports ”包下的日志缀踪,控制臺和日志文件都使用debug級別。
<logger name="com.sports" level="DEBUG" additivity="false">
<appender-ref ref="STDOUT"/>
<appender-ref ref="LOG_FILE"/>
<!--<appender-ref ref="myAppender"/>-->
</logger>
(5)必須對主體日志指定輸出級別
雖然我們會對不同的包或者框架下日志設(shè)置輸出級別虹脯,但不可缺少主體日志輸出級別:root
<root level="INFO">
<appender-ref ref="STDOUT"/>
<appender-ref ref="LOG_FILE"/>
<!--<appender-ref ref="mqAppender"/>-->
</root>
(6)日志可以異步寫入
通常日志是和業(yè)務(wù)應(yīng)用公用同一個線程驴娃,寫系統(tǒng)日志會有IO
開銷,會損耗性能循集,我們應(yīng)該可以異步寫日志
<!-- 異步輸出 -->
<appender name="ASYNC-INFO" class="ch.qos.logback.classic.AsyncAppender">
<!-- 不丟失日志.默認(rèn)的,如果隊列的80%已滿,則會丟棄TRACT唇敞、DEBUG、INFO級別的日志 -->
<discardingThreshold>0</discardingThreshold>
<!-- 更改默認(rèn)的隊列的深度,該值會影響性能.默認(rèn)值為256 -->
<queueSize>256</queueSize>
<!-- 添加附加的appender,最多只能添加一個 -->
<appender-ref ref="INFO-LOG"/>
</appender>
2.2 文件樣例
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern><![CDATA[%n[%d{yyyy-MM-dd HH:mm:ss.SSS}] [level: %p] [Thread: %t] [ Class:%c >> Method: %M:%L ]%n%p:%m%n]]></pattern>
</encoder>
</appender>
<appender name="LOG_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<encoder>
<pattern><![CDATA[%n[%d{yyyy-MM-dd HH:mm:ss.SSS}] [level: %p] [Thread: %t] [ Class:%c >> Method: %M:%L ]%n%p:%m%n]]></pattern>
</encoder>
<file>logs/sports-web.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<fileNamePattern>logs/sports-web.-%d{yyyyMMdd}.%i.log</fileNamePattern>
<!-- 每天一個日志文件咒彤,當(dāng)天的日志文件超過10MB時疆柔,生成新的日志文件,當(dāng)天的日志文件數(shù)量超過totalSizeCap/maxFileSize镶柱,日志文件就會被回滾覆蓋旷档。 -->
<maxFileSize>10MB</maxFileSize>
<maxHistory>30</maxHistory>
<totalSizeCap>10GB</totalSizeCap>
</rollingPolicy>
</appender>
<logger name="com.sports" level="DEBUG" additivity="false">
<appender-ref ref="STDOUT"/>
<appender-ref ref="LOG_FILE"/>
<!--<appender-ref ref="myAppender"/>-->
</logger>
<root level="INFO">
<appender-ref ref="STDOUT"/>
<appender-ref ref="LOG_FILE"/>
<!--<appender-ref ref="mqAppender"/>-->
</root>
</configuration>
3、日志格式pattern部分
logback框架日志格式通過PatternLayout
方式配置歇拆,樣例:
<encoder>
<pattern>%-4relative [%thread] %-5level %logger{35} - %msg%n</pattern>
</encoder
encoder作用:①把日志信息轉(zhuǎn)換成字節(jié)數(shù)組鞋屈;②把字節(jié)數(shù)組寫入到輸出流。
PatternLayoutEncoder
是唯一有用的且默認(rèn)的encoder
故觅,encoder
下只有一個pattern
節(jié)點厂庇。
(1)% + “轉(zhuǎn)換符號”輸出信息
%t
: t表示線程的轉(zhuǎn)換符,打印控制臺" [Thread: restartedMain]"
pattern中的轉(zhuǎn)換符列表
轉(zhuǎn)換符 | 說明 | 使用方式 | 備注 |
---|---|---|---|
m / msg / message | 應(yīng)用程序輸出信息 | %msg | 主要內(nèi)容信息 |
M / method | 輸出執(zhí)行日志請求的方法名逻卖。 | %M | 盡量避免使用宋列,除非執(zhí)行速度不造成任何問題 |
p / le / level | 日志等級 | %p | |
L / line | 行號 | %line | 盡量避免使用,除非執(zhí)行速度不造成任何問題 |
(2)格式修飾符
與轉(zhuǎn)換符共同使用评也,可選的格式修飾符位于“%”和轉(zhuǎn)換符之間
左對齊 修飾符 :符號是減號“-”炼杖;接著是可選的最小寬度 修飾符,用十進制數(shù)表示
(3)使用slf4j
中的MDC
新增線程參數(shù)
“%X
”用于輸出和當(dāng)前線程相關(guān)聯(lián)的MDC
(嵌套診斷環(huán)境)盗迟,格式 %X{xxx}坤邪,使用org.slf4j.MDC
添加key/value
即可增加新值,
<encoder>
<pattern>%d{yyyy-MM-dd hh:mm:ss} [%thread] [traceId = %X{traceId}] [%logger{32}] - %msg%n</pattern>
</encoder>
其中tracId是在MDC中設(shè)置進當(dāng)前線程中的參數(shù)罚缕,記得在線程運行完時清除clear
掉艇纺。
@Before(value = "pointCut()")
public void before(JoinPoint joinPoint){
// 省略代碼...
MDC.put("traceId", UUID.randomUUID().toString());
}
- 結(jié)束清除
@AfterReturning(value = "pointCut()", returning = "val")
public void afterReturning(JoinPoint joinPoint, Object val) {
// 省略代碼...
MDC.clear();
}
- 各個參數(shù)說明
示例 | 說明 |
---|---|
%X | 輸出所有值 |
%X{testKey} | 輸出testKey所對應(yīng)的value,且無默認(rèn)值 |
%X{testKey:-} | 輸出testKey所對應(yīng)的value,默認(rèn)為空 |
%X{testKey:-aaa} | 輸出testKey所對應(yīng)的value黔衡,默認(rèn)為aaa |