上一篇文章介紹了spring boot配置自定義日志文件logback.xml
今天這篇文章簡單介紹一下logback.xml配置文件的一些含義。
1.基本結構
logback的基本結構如下圖:

- configuration 表示配置的根節點
- appender 用來格式化日志輸出
- logger 用來設置一個包或者類的日志打印級別
- contextName 設置上下文名稱,一般不使用
- property 用于定義變量
2.configuration
configuration有三個屬性
scan: 當此屬性設置為true時,配置文件如果發生改變,將會被重新加載,默認值為true。
scanPeriod: 設置監測配置文件是否有修改的時間間隔,如果沒有給出時間單位,默認單位是毫秒。當scan為true時,此屬性生效。默認的時間間隔為1分鐘。
debug: 當此屬性設置為true時,將打印出logback內部日志信息,實時查看logback運行狀態。默認值為false。
示例:
<configuration scan="true" scanPeriod="60 seconds" debug="false">
<!--其他配置省略-->
</configuration>
3.appender
這個節點負責寫日志,有兩個必填屬性,name和class。name是當前輸出器的名字,class是appender的全限定名。
class有下面幾類:
ch.qos.logback.core.ConsoleAppender
ch.qos.logback.core.FileAppender
ch.qos.logback.core.rolling.RollingFileAppender
3.1 ConsoleAppender
將日志輸出到控制臺,有以下子節點
<encoder>:對日志進行格式化。
<target>:字符串System.out(默認)或者System.err
示例:把>=DEBUG級別的日志都輸出到控制臺
<configuration>
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>%-4relative [%thread] %-5level %logger{35} - %msg %n</pattern>
</encoder>
</appender>
<root level="DEBUG">
<appender-ref ref="STDOUT" />
</root>
</configuration>
也可以加入攔截器,比如下面這樣
<configuration>
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
<level>ERROR</level>
</filter>
<encoder>
<pattern>%-4relative [%thread] %-5level %logger{35} - %msg %n</pattern>
</encoder>
</appender>
<root level="DEBUG">
<appender-ref ref="STDOUT" />
</root>
</configuration>
3.2 FileAppender
<file>:被寫入的文件名,可以是相對目錄,也可以是絕對目錄,如果上級目錄不存在會自動創建,沒有默認值。
<append>:如果是 true,日志被追加到文件結尾,如果是 false,清空現存文件,默認是true。
<encoder>:對記錄事件進行格式化。
<prudent>:如果是 true,日志會被安全的寫入文件,即使其他的FileAppender也在向此文件做寫入操作,效率低,默認是 false。
示例:把>=DEBUG級別的日志都輸出到testFile.log
<configuration>
<appender name="FILE" class="ch.qos.logback.core.FileAppender">
<file>testFile.log</file>
<append>true</append>
<encoder>
<pattern>%-4relative [%thread] %-5level %logger{35} - %msg%n</pattern>
</encoder>
</appender>
<root level="DEBUG">
<appender-ref ref="FILE" />
</root>
</configuration>
3.3 RollingFileAppender
滾動記錄文件,先將日志記錄到指定文件,當符合某個條件時,將日志記錄到其他文件。有以下子節點:
<file>:被寫入的文件名,可以是相對目錄,也可以是絕對目錄,如果上級目錄不存在會自動創建,沒有默認值。
<append>:如果是 true,日志被追加到文件結尾,如果是 false,清空現存文件,默認是true。
<rollingPolicy>:當發生滾動時,決定RollingFileAppender的行為,涉及文件移動和重命名。屬性class定義具體的滾動策略類
<1> class=”ch.qos.logback.core.rolling.TimeBasedRollingPolicy”: 最常用的滾動策略,它根據時間來制定滾動策略,既負責滾動也負責出發滾動。有以下子節點:
<fileNamePattern>:必要節點,包含文件名及“%d”轉換符,“%d”可以包含一個java.text.SimpleDateFormat指定的時間格式,如:%d{yyyy-MM}。
如果直接使用 %d,默認格式是 yyyy-MM-dd。RollingFileAppender的file字節點可有可無,通過設置file,可以為活動文件和歸檔文件指定不同位置,當前日志總是記錄到file指定的文件(活動文件),活動文件的名字不會改變;
如果沒設置file,活動文件的名字會根據fileNamePattern 的值,每隔一段時間改變一次?!?”或者“\”會被當做目錄分隔符。
<maxHistory>:可選節點,控制保留的歸檔文件的最大數量,超出數量就刪除舊文件。假設設置每個月滾動,且<maxHistory>是6,則只保存最近6個月的文件,刪除之前的舊文件。注意,刪除舊文件是,那些為了歸檔而創建的目錄也會被刪除。
<2> class=”ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy”: 查看當前活動文件的大小,如果超過指定大小會告知RollingFileAppender 觸發當前活動文件滾動。只有一個節點:
<maxFileSize>:這是活動文件的大小,默認值是10MB。
<prudent>:當為true時,不支持FixedWindowRollingPolicy。支持TimeBasedRollingPolicy,但是有兩個限制,1不支持也不允許文件壓縮,2不能設置file屬性,必須留空。
<triggeringPolicy >: 告知 RollingFileAppender 合適激活滾動。
<3> class=”ch.qos.logback.core.rolling.FixedWindowRollingPolicy” 根據固定窗口算法重命名文件的滾動策略。有以下子節點:
<minIndex>:窗口索引最小值
<maxIndex>:窗口索引最大值,當用戶指定的窗口過大時,會自動將窗口設置為12。
<fileNamePattern>:必須包含“%i”例如,假設最小值和最大值分別為1和2,命名模式為 mylog%i.log,會產生歸檔文件mylog1.log和mylog2.log。還可以指定文件壓縮選項,例如,mylog%i.log.gz 或者 沒有log%i.log.zip
比如下面這個例子:每天生成一個日志文件,保存30天的日志文件。
<configuration>
<appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>logFile.%d{yyyy-MM-dd}.log</fileNamePattern>
<maxHistory>30</maxHistory>
</rollingPolicy>
<encoder>
<pattern>%-4relative [%thread] %-5level %logger{35} - %msg%n</pattern>
</encoder>
</appender>
<root level="DEBUG">
<appender-ref ref="FILE" />
</root>
</configuration>
4.logger
這個節點主要用來設置某個包或者某個類的日志打印級別,非必填節點,如果不需要可以不用寫。一般的用途是打印sql操作。它有下面這些節點
name: 用來指定受此loger約束的某一個包或者具體的某一個類。
level: 用來設置打印級別,大小寫無關:TRACE, DEBUG, INFO, WARN, ERROR, ALL和OFF,還有一個特殊值INHERITED或者同義詞NULL,代表強制執行上級的級別。 如果未設置此屬性,那么當前loger將會繼承上級的級別。
addtivity: 是否向上級logger傳遞打印信息。默認是true??梢园銈€或多個<appender-ref>元素,標識這個appender將會添加到這個logger。
比如下面這樣:
<logger name="site.longkui.app.mapper" level="DEBUG" />
這個就表示site.longkui.app.mapper這個具體的類下面要打印DEBUG層級的日志,不過經過實踐,上面這段代碼并不完全好用,配置成下面這樣就OK了
<springProfile name="dev">
<logger name="site.longkui.app.mapper" level="DEBUG" />
</springProfile>
5.root
必填,用來指定日志輸出級別。下面可以包含多個appender-ref。比如下面這樣:
<!-- 日志輸出級別 -->
<root level="DEBUG">
<appender-ref ref="STDOUT" />
<appender-ref ref="FILE"/>
</root>
表示輸出的debug級別的日志,而且只包含 appender的名稱是STDOUT和FILE的兩個輸出器。
6.contextName
非必填節點,主要用來設置上下文名稱,用于區分不同應用程序的記錄。
比如下面這:
<configuration scan="true" scanPeriod="60 seconds" debug="false">
<contextName>myAppName</contextName>
<!--其他配置省略-->
</configuration>
7.property
主要用來定義變量的,它有兩個屬性name和value,通過<property>定義的值會被插入到logger上下文中,可以使“${}”來使用變量?!?/p>
比如下面這樣:
<configuration scan="true" scanPeriod="60 seconds" debug="false">
<property name="APP_Name" value="myAppName" />
<contextName>${APP_Name}</contextName>
<!--其他配置省略-->
</configuration>