1、為什么使用logback
- 內核重寫、測試充分、初始化內存加載更小,這一切讓logback性能和log4j相比有諸多倍的提升
- logback非常自然地直接實現了slf4j,方便理解
- 支持自動去除舊的日志文件,可以控制已經產生日志文件的最大數量
- 官方自動配置了許多的appender,方便使用
2、springboot中為什么使用logback-spring.xml來代替logback.xml
logback.xml的加載早於application.properties,所以如果在logback.xml中使用了變量,而恰好這個變量是寫在application.properties時,那么就會獲取不到,只要改成logback-spring.xml就可以解決。
3、屬性
(1)configuration
configuration是logback的父節點,它只有三個屬性:
- scan
自動加載判斷,當配置文件發生改變時,將會被重新加載。默認為true
- scanPeriod
檢測配置文件是否有修改的時間間隔,如果沒有給出時間單位,默認為毫秒,當scan=true時這個值生效,默認時間間隔為1分鍾
- debug
當被設置為true時,將打印出logback內部日志信息,實時查看logback運行信息,默認為false
(2)logger
<logger>用來設置某一個包或者某一個具體類的日志打印級別以及方式。在logger內可以包含零個或者多個appender-ref,然后對應的appender將會被添加到這個logger。它的屬性有:
- name
指定對應的包路徑或者類路徑。
- level
用來設置日志打印的級別,五個常用打印級別從低至高依次為TRACE、DEBUG、INFO、WARN、ERROR,如果未設置此級別,那么當前logger會繼承上級的級別
- additivity
是否向上級log傳遞打印信息,默認為true
(3)root
<root>也是logger元素,但它是根logger,所有logger的最上級,只有一個level屬性,它的name固定為ROOT
(4)appender
<appender>是configuration的子節點,它的作用是定義日志輸出的方式。它有2個必要的屬性:
- name:指定當前appender的名稱
- class:指定appender對應的類,控制日志輸出方式
(5)encoder
encoder主要負責的是將日志信息轉換成字節數組以及將字節數組寫到輸出流中去。encoder
轉換符 | 作用 | ||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
c {length } lo {length } logger {length } |
輸出日志的logger名,可有一個整形參數,功能是縮短logger名,設置為0表示只輸入logger最右邊點符號之后的字符串。
|
||||||||||||||||||||||||
C {length } class {length } |
輸出執行記錄請求的調用者的全限定名。參數與上面的一樣。盡量避免使用,除非執行速度不造成任何問題。 | ||||||||||||||||||||||||
contextName cn |
輸出上下文名稱。 | ||||||||||||||||||||||||
d {pattern } date {pattern } |
輸出日志的打印日志,模式語法與java.text.SimpleDateFormat 兼容。
|
||||||||||||||||||||||||
F / file | 輸出執行記錄請求的java源文件名。盡量避免使用,除非執行速度不造成任何問題。 | ||||||||||||||||||||||||
caller{depth}caller{depth, evaluator-1, ... evaluator-n} | 輸出生成日志的調用者的位置信息,整數選項表示輸出信息深度。 例如, %caller{2} 輸出為: 0 [main] DEBUG - logging statement Caller+0 at mainPackage.sub.sample.Bar.sampleMethodName(Bar.java:22) Caller+1 at mainPackage.sub.sample.Bar.createLoggingRequest(Bar.java:17) 例如, %caller{3} 輸出為: 16 [main] DEBUG - logging statement Caller+0 at mainPackage.sub.sample.Bar.sampleMethodName(Bar.java:22) Caller+1 at mainPackage.sub.sample.Bar.createLoggingRequest(Bar.java:17) Caller+2 at mainPackage.ConfigTester.main(ConfigTester.java:38) |
||||||||||||||||||||||||
L / line | 輸出執行日志請求的行號。盡量避免使用,除非執行速度不造成任何問題。 | ||||||||||||||||||||||||
m / msg / message | 輸出應用程序提供的信息。 |
||||||||||||||||||||||||
M / method | 輸出執行日志請求的方法名。盡量避免使用,除非執行速度不造成任何問題。 | ||||||||||||||||||||||||
n | 輸出平台先關的分行符“\n”或者“\r\n”。 | ||||||||||||||||||||||||
p / le / level | 輸出日志級別。 | ||||||||||||||||||||||||
r / relative | 輸出從程序啟動到創建日志記錄的時間,單位是毫秒 | ||||||||||||||||||||||||
t / thread | 輸出產生日志的線程名。 | ||||||||||||||||||||||||
replace(p ){r, t} | p 為日志內容,r 是正則表達式,將p 中符合r 的內容替換為t 。 例如, "%replace(%msg){‘\s‘, ‘‘}"
|
(6)filter
<filter>是appender的子節點,表示對當前給定的日志級別再進行一次過濾。配置方式:
<filter class="ch.qos.logback.classic.filter.LevelFilter"><!-- 只打印錯誤日志 --> <level>ERROR</level> <onMatch>ACCEPT</onMatch> <onMismatch>DENY</onMismatch> </filter>
4、常用Appender說明
(1)ConsoleAppender
作用是將日志輸出到控制台。配置方式為:
<appender name="console" class="ch.qos.logback.core.ConsoleAppender"> <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder"> <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern> </encoder> </appender>
(2)FileAppender
作用是將日志寫入到文件中去。配置方式:
<appender name="FILE" class="ch.qos.logback.core.FileAppender"> <file>存儲路徑</file> <!-- true表示添加到文件結尾,false表示清空文件 --> <append>true</append> <encoder> <pattern>%-4relative [%thread] %-5level %logger{35} - %msg%n</pattern> </encoder> </appender>
(3)RollingFileAppender
作用是滾動記錄文件,先將文件記錄到指定文件,當符合某個條件時,再將文件記錄到其他的文件中去。配置方式:
<appender name="ERROR" class="ch.qos.logback.core.rolling.RollingFileAppender"> <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> <!--日志文件輸出的文件名--> <FileNamePattern>${LOG_HOME}/error/spring-error-%d{yyyy-MM-dd}.log</FileNamePattern> <!--日志文件保留天數--> <MaxHistory>30</MaxHistory> </rollingPolicy> <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder"> <!--格式化輸出:%d表示日期,%thread表示線程名,%-5level:級別從左顯示5個字符寬度%msg:日志消息,%n是換行符--> <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern> </encoder> <!--日志文件最大的大小--> <triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy"> <MaxFileSize>100MB</MaxFileSize> </triggeringPolicy> <filter class="ch.qos.logback.classic.filter.LevelFilter"><!-- 只打印錯誤日志 --> <level>ERROR</level> <onMatch>ACCEPT</onMatch> <onMismatch>DENY</onMismatch> </filter> </appender>
(4)異步寫日志
通常日志會記錄到文件中去,此時寫一次就會造成一次磁盤IO,而采取異步寫日志方式后,不讓此次寫日志阻塞線程,造成不必要的性能損耗。配置方式:
<!-- 異步輸出 --> <appender name ="ASYNC" class= "ch.qos.logback.classic.AsyncAppender"> <!-- 不丟失日志.默認的,如果隊列的80%已滿,則會丟棄TRACT、DEBUG、INFO級別的日志 --> <discardingThreshold>0</discardingThreshold> <!-- 更改默認的隊列的深度,該值會影響性能.默認值為256 --> <queueSize>512</queueSize> <!-- 添加附加的appender,最多只能添加一個 --> <appender-ref ref ="ERROR"/> </appender>