logback使用與配置檔案logback.xml詳解
一、logback簡介
- Logback由log4j創始人設計的另一個開源日誌元件,官網:http://logback.qos.ch。它當前分為下面三模組:
- logback-core:其它兩個模組的基礎模組
- logback-classic:它是log4j的一個改良版本,同時它完整實現了slf4jAPI使你可以很方便地更換成其它日誌系統如log4j或JDK14 Logging
- logback-access:訪問模組與Servlet容器整合提供通過Http來訪問日誌的功能
二、maven依賴
logback需要和slf4j一起使用,共需新增依賴包有slf4j-api.jar,logback-core.jar,logback-classic.jar,logback-access.jar暫時不用不新增.
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<logback.version>1.1.7</logback.version>
<slf4j.version>1.7.21</slf4j.version>
</properties>
<dependencies>
<dependency>
<groupId >org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>${slf4j.version}</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-core</artifactId >
<version>${logback.version}</version>
</dependency>
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<version>${logback.version}</version>
</dependency>
</dependencies>
三、logback.xml
<?xml version="1.0" encoding="UTF-8"?>
<!--configuration屬性:
scan: 為true時,配置檔案發生改變,將會被重新載入,預設值為true。
scanPeriod: 監測配置檔案是否有修改的時間間隔,預設單位是毫秒。當scan為true時,此屬性生效。預設間隔1分鐘。
debug: 為true時,將打印出logback內部日誌資訊,實時檢視logback執行狀態。預設值為false。 -->
<configuration debug="false">
<!--定義日誌檔案的儲存地址 勿在 LogBack 的配置中使用相對路徑-->
<property name="LOG_HOME" value="/home" />
<!-- 控制檯輸出 -->
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<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>
</appender>
<!-- 按照每天生成日誌檔案 -->
<appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!--日誌檔案輸出的檔名-->
<FileNamePattern>${LOG_HOME}/TestWeb.log.%d{yyyy-MM-dd}.log</FileNamePattern>
<!--日誌檔案保留天數-->
<MaxHistory>30</MaxHistory>
</rollingPolicy>
<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>
<!--日誌檔案最大的大小-->
<triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
<MaxFileSize>10MB</MaxFileSize>
</triggeringPolicy>
</appender>
<!-- 日誌輸出級別 -->
<root level="INFO">
<appender-ref ref="STDOUT" />
</root>
</configuration>
四、logback的預設配置
Logback預設配置的步驟
1. 在 classpath下查詢檔案logback-test.xml;
2. 如果不存在,則查詢logback.xml;
3. 如果都不存在,logback用BasicConfigurator自動配置,記錄輸出到控制檯。
Logback用BasicConfigurator自動配置,建立一個最小化配置。輸出用模式為%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n 的 PatternLayoutEncoder 進行格式化。root logger 預設級別是 DEBUG。
五、logback.xml常用配置
1、子節點 appender
負責寫日誌的元件,它有兩個必要屬性name和class。name指定appender名稱,class指定appender的全限定名
- ConsoleAppender 把日誌輸出到控制檯.
<!-- <encoder>:對日誌進行格式化。 -->
<!-- <target>:字串System.out(預設)或者System.err -->
<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>
2. FileAppender:把日誌新增到檔案.
<!-- <file>:被寫入的檔名,可以是相對目錄,也可以是絕對目錄,如果上級目錄不存在會自動建立,沒有預設值。
<append>:如果是 true,日誌被追加到檔案結尾,如果是 false,清空現存檔案,預設是true。
<encoder>:對記錄事件進行格式化。(具體引數稍後講解 )
<prudent>:如果是 true,日誌會被安全的寫入檔案,即使其他的FileAppender也在向此檔案做寫入操作,效率低,預設是 false。
-->
<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. RollingFileAppender:滾動記錄檔案,先將日誌記錄到指定檔案,當符合某個條件時,將日誌記錄到其他檔案。
<!-- <file>:被寫入的檔名,相對目錄或絕對目錄,上級目錄不存在會自動建立,沒有預設值。
<append>: true,日誌被追加到檔案結尾,false,清空現存檔案,預設是true。
<rollingPolicy>:當發生滾動時,決定RollingFileAppender的行為,涉及檔案移動和重新命名。
屬性class定義具體的滾動策略類
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>:
class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy": 檢視當前活動檔案的大小,如果超過指定大小會告知RollingFileAppender 觸發當前活動檔案滾動。只有一個節點:
<maxFileSize>:這是活動檔案的大小,預設值是10MB。
<prudent>:當為true時,不支援FixedWindowRollingPolicy。支援TimeBasedRollingPolicy,但是有兩個限制,1不支援也不允許檔案壓縮,2不能設定file屬性,必須留空。
<triggeringPolicy >: 告知 RollingFileAppender 合適啟用滾動。
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
-->
<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>
<!-- 上述配置表示每天生成一個日誌檔案,儲存30天的日誌檔案。-->
<configuration>
<appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>test.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
<fileNamePattern>tests.%i.log.zip</fileNamePattern>
<minIndex>1</minIndex>
<maxIndex>3</maxIndex>
</rollingPolicy>
<triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
<maxFileSize>5MB</maxFileSize>
</triggeringPolicy>
<encoder>
<pattern>%-4relative [%thread] %-5level %logger{35} - %msg%n</pattern>
</encoder>
</appender>
<root level="DEBUG">
<appender-ref ref="FILE" />
</root>
</configuration>
<!--
上述配置表示按照固定視窗模式生成日誌檔案,當檔案大於20MB時,生成新的日誌檔案。視窗大小是1到3,當儲存了3個歸檔檔案後,將覆蓋最早的日誌。
<encoder>:對記錄事件進行格式化。負責兩件事,一是把日誌資訊轉換成位元組陣列,二是把位元組陣列寫入到輸出流。
PatternLayoutEncoder 是唯一有用的且預設的encoder ,有一個<pattern>節點,用來設定日誌的輸入格式。使用“%”加“轉換符”方式,如果要輸出“%”,則必須用“\”對“\%”進行轉義。-->
4. SocketAppender、SMTPAppender、DBAppender、SyslogAppender、SiftingAppender,並不常用。
大家可以參考官方文件(http://logback.qos.ch/documentation.html),還可以編寫自己的Appender。
2. 子節點 logger
用來設定某一個包或具體的某一個類的日誌列印級別、以及指定 appender。
logger僅有一個name屬性,一個可選的level和一個可選的addtivity屬性。
- 包含零個或多個 appender-ref 元素,標識這個appender將會新增到這個loger
name: 用來指定受此loger約束的某一個包或者具體的某一個類。
level: 用來設定列印級別,大小寫無關:TRACE, DEBUG, INFO, WARN, ERROR, ALL和OFF,還有一個特俗值INHERITED或者同義詞NULL,代表強制執行上級的級別。 如果未設定此屬性,那麼當前loger將會繼承上級的級別。
- addtivity: 是否向上級loger傳遞列印資訊。預設是true。
3. 子節點 root
它也是 logger元素,但是它是根logger,是所有 logger的上級。只有一個level屬性,因為name已經被命名為”root”,且已經是最上級了。
level: 用來設定列印級別,大小寫無關:TRACE, DEBUG, INFO, WARN, ERROR, ALL和OFF,不能設定為INHERITED或者同義詞NULL。 預設是DEBUG。