什麼是 Logback
logback
繼承自log4j
,它建立在有十年工業經驗的日誌系統之上。它比其它所有的日誌系統更快並且更小,包含了許多獨特並且有用的特性。
這話是官網說的
Logback 的配置
Configruation
從上面的配置例子中我們可以看到根節點爲<configuration>
在根節點的配置中包含了三個屬性如下:
scan
: 當此屬性設置爲true
時,配置文件如果發生改變,將會被重新加載,默認值爲true
。scanPeriod
: 設置監測配置文件是否有修改的時間間隔,如果沒有給出時間單位,默認單位是毫秒。當scan
爲true
時,此屬性生效。默認的時間間隔爲1
分鐘。debug
: 當此屬性設置爲true
時,將打印出logback
內部日誌信息,實時查看logback
運行狀態。默認值爲false
。
比如如下配置:
<configuration scan="true" scanPeriod="60 seconds" debug="false">
</configuration>
Property
<property>
標籤作爲<configuration>
標籤的子標籤主要用來定義變量的,它有name
和value
兩個屬性,他的值會進入logger
的上下文中,使用${name}
可以引用到。
name
: 變量的名稱。value
: 變量的值。
比如如下配置:
<property name="APP_NAME" value="DEMO"/>
Timestamp
<timestamp>
標籤作爲<configuration>
標籤的子標籤主要用來獲取當前時間的字符串,它有key
和dataPattern
兩個屬性,它也同樣會進入logger
的上下文中,使用${key}
可以引用到。
key
: 表示此標籤的名字,類似上面property
的name
作用。dataPattern
: 設置將當前時間(解析配置文件的時間)轉換爲字符串的模式,遵循java.txt.SimpleDateFormat
的格式。
比如如下配置:
<timestamp key="FULL_DATE" dataPattern="yyyy-MM-dd HH:mm:ss"/>
emmmm
感覺好像用的不多。
Appender
<appender>
標籤是寫日誌的組件,它主要有兩個屬性即name
和class
。
name
: 即指定該組件的名稱。class
: 爲全限定名,他們必須實現自ch.qos.logback.core.Appender
接口。
常用的Appender
有三種,他們分別是ConsoleAppender
、FileAppender
、RollingFileAppender
。
選擇每一個不同的Appender
,所具有的子節點是不同的。
在開始介紹不同的Appender
之前,先介紹幾個轉換標記,因爲在下面寫文件名以及格式化日誌的時候會用到:
-
%d
: 輸出日誌時間點的日期或時間,指定格式的方式%d{yyyy-MM-dd HH:mm:ss}
-
%i
: 這是個一個自增索引,在分文件的時候,達到設的限制時,索引便會自增,從0
開始,下面會用到 -
%p
: 輸出優先級,即DEBUG
、INFO
、WARN
、ERROR
、FATAL
-
%r
: 輸出從應用啓動到輸出該日誌所耗費的毫秒數 -
%t
: 輸出產生該日誌的線程名 -
%f
: 輸出日誌所屬的類別名 -
%c
: 輸出日誌類的全名 -
%l
: 輸出日誌事件的發生位置,即輸出日誌語句在他所在類別的第幾行。 -
%m
: 輸出代碼中指定的信息,如log(message)
中的message
-
%n
: 輸出一個換行符號
ConsoleAppender
ConsoleAppender
所對應的是將日誌寫到控制檯的,它具有以下子節點:
<encoder>
: 對日誌進行格式化。
例如:
<!-- 控制檯輸出 -->
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>
[%-5level] [%date{yyyy-MM-dd HH:mm:ss}] %logger{96} [%line] - %msg%n</pattern>
<charset>UTF-8</charset>
</encoder>
</appender>
FileAppender
FileAppender
是將日誌寫入到文件中,它有以下子節點:
<file>
: 被寫入的文件名,可以是相對目錄,也可以是絕對目錄,如果上級目錄不存在會自動創建,沒有默認值。<append>
: 如果是true
,日誌被追加到文件結尾,如果是false
,清空現存文件,默認是true
。<encoder>
: 對日誌進行格式化。<prudent>
: 如果是true
,日誌會被安全的寫入文件,即使其他的FileAppender
也在向此文件做寫入操作,效率低,默認是false
。
例如:
<!-- 全量輸出,用於 Admin 監控日誌 -->
<appender name="MONITOR_FILE" class="ch.qos.logback.core.FileAppender">
<encoder>
<pattern>${PATTERN}</pattern>
<charset>UTF-8</charset>
</encoder>
<file>logs/${APP_NAME}.log</file>
<prudent>true</prudent>
</appender>
這裏的${PATTERN}
就是取的上文中提到的<property>
標籤,將[%-5level] [%date{yyyy-MM-dd HH:mm:ss}] %logger{96} [%line] - %msg%n
定義在其中了
RollingFileAppender
RollingFileAppender
是個滾動記錄文件的組件,先將日誌記錄到指定文件,當符合指定的條件時,會將日誌文件截斷記錄到其他文件。有以下子節點:
<file>
: 被寫入的文件名,可以是相對目錄,也可以是絕對目錄,如果上級目錄不存在會自動創建,沒有默認值。<encoder>
: 對日誌進行格式化。<append>
: 如果是true
,日誌被追加到文件結尾,如果是false
,清空現存文件,默認是true
。<rollingPolicy>
: 當發生滾動時,決定RollingFileAppender
的行爲,涉及文件移動和重命名。屬性class
定義具體的滾動策略類。這裏有幾種常見的策略,比如:TimeBasedRollingPolicy
: 這是一種相對比較常用的策略,可以按天、按月等來分日誌文件。SizeAndTimeBasedRollingPolicy
: 這種策略是用來在比如按日期歸檔文件的時候,想要限制其大小,可以使用這種策略來實現。
例如:
<!-- 記錄 INFO 日誌 -->
<appender name="INFO_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<encoder>
<pattern>${PATTERN}</pattern>
<charset>UTF-8</charset>
</encoder>
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>INFO</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>${LOG_DIR}/${APP_NAME}/info-${APP_NAME}-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
<timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<maxFileSize>32 MB</maxFileSize>
</timeBasedFileNamingAndTriggeringPolicy>
</rollingPolicy>
<prudent>true</prudent>
</appender>
Logger
該節點設置某一個包下或者某一個類的日誌級別的,他有以下屬性:
name
: 用來指定受此logger
作用的某一個包或者具體的某一個類。level
: 用來設置當前指定包或類的日誌級別,大小寫不敏感,可以設置:TRACE
、DEBUG
、INFO
、WARN
、ERROR
、ALL
和OFF
,還有一個特殊的值INHERITED
或者NULL
,代表強制執行上級的級別,如果未設置此屬性,那麼當前logger
將會繼承上級的級別。addtivity
: 是否向上級logger
傳遞打印信息。默認是true
。
例如:
<logger name="org.mybatis.spring" level="INFO" />
Root
<root>
節點也是一個必選的節點,用來指定基礎的日誌輸出級別,就是除了上面<logger>
指定的,其他都是按此級別的,它只有一個level
屬性:
level
: 也是用來指定日誌級別的,但是這裏不能設置特殊的值INHERITED
或者NULL
了,默認是DEBUG
,其可以包含零個或者多個元素,標識使用哪些appender
會在這裏生效。
例如:
<root level="INFO">
<appender-ref ref="STDOUT" />
<appender-ref ref="INFO_FILE" />
<appender-ref ref="WARN_FILE" />
<appender-ref ref="DEBUG_FILE" />
<appender-ref ref="ERROR_FILE" />
</root>
完整示例
這個便是在學習這些配置的時候,結合自己要寫的工程編寫的logbakc-spring.xml
文件,結合上面所說的配置,再加上少量註釋,應該大致可以理解了:
<!-- Logback configuration. See http://logback.qos.ch/manual/index.html -->
<configuration scan="true" scanPeriod="10 seconds">
<property name="APP_NAME" value="queen-registry"/>
<property name="PATTERN" value="[%-5level] [%date{yyyy-MM-dd HH:mm:ss}] %logger{96} [%line] - %msg%n"/>
<!-- 控制檯輸出 -->
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>${PATTERN}</pattern>
<charset>UTF-8</charset>
</encoder>
</appender>
<!-- 全量輸出,用於 Admin 監控日誌 -->
<appender name="MONITOR_FILE" class="ch.qos.logback.core.FileAppender">
<encoder>
<pattern>${PATTERN}</pattern>
<charset>UTF-8</charset>
</encoder>
<file>logs/${APP_NAME}.log</file>
<prudent>true</prudent>
</appender>
<!-- 記錄 INFO 日誌 -->
<appender name="INFO_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<encoder>
<pattern>${PATTERN}</pattern>
<charset>UTF-8</charset>
</encoder>
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>INFO</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>${APP_NAME}/logs/info-${APP_NAME}-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
<timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<maxFileSize>32 MB</maxFileSize>
</timeBasedFileNamingAndTriggeringPolicy>
</rollingPolicy>
<prudent>true</prudent>
</appender>
<!-- 記錄 WARN 日誌 -->
<appender name="WARN_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<encoder>
<pattern>${PATTERN}</pattern>
<charset>UTF-8</charset>
</encoder>
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>WARN</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>${APP_NAME}/logs/warn-${APP_NAME}-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
<timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<maxFileSize>32 MB</maxFileSize>
</timeBasedFileNamingAndTriggeringPolicy>
</rollingPolicy>
<prudent>true</prudent>
</appender>
<!-- 記錄 DEBUG 日誌 -->
<appender name="DEBUG_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<encoder>
<pattern>${PATTERN}</pattern>
<charset>UTF-8</charset>
</encoder>
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>DEBUG</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>${APP_NAME}/logs/debug-${APP_NAME}-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
<timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<maxFileSize>32 MB</maxFileSize>
</timeBasedFileNamingAndTriggeringPolicy>
</rollingPolicy>
<prudent>true</prudent>
</appender>
<!-- 記錄 ERROR 日誌 -->
<appender name="ERROR_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<encoder>
<pattern>${PATTERN}</pattern>
<charset>UTF-8</charset>
</encoder>
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>ERROR</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>${APP_NAME}/logs/error-${APP_NAME}-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
<timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<maxFileSize>32 MB</maxFileSize>
</timeBasedFileNamingAndTriggeringPolicy>
</rollingPolicy>
<prudent>true</prudent>
</appender>
<!-- 這裏的 springProfile 主要是用來區分環境的 -->
<!-- 開發、預發環境 -->
<springProfile name="dev, staging">
<root level="INFO">
<appender-ref ref="STDOUT" />
<appender-ref ref="MONITOR_FILE" />
</root>
<logger name="top.felixu.queen" level="DEBUG"/>
<logger name="org.mybatis.spring" level="INFO" />
<logger name="com.netflix.discovery" level="INFO" />
<logger name="org.springframework.amqp.rabbit" level="INFO" />
</springProfile>
<!-- 生產環境 -->
<springProfile name="prod">
<root level="INFO">
<appender-ref ref="STDOUT" />
<appender-ref ref="INFO_FILE" />
<appender-ref ref="WARN_FILE" />
<appender-ref ref="DEBUG_FILE" />
<appender-ref ref="ERROR_FILE" />
</root>
</springProfile>
</configuration>
結語
在寫完這篇文章的時候還發現了箇中文網http://www.logback.cn/
參考自[logback官網](