Logback中文文檔(四):Appender

什麼是 Appender

Appender是負責寫記錄事件的組件。Appender 必須實現接口「ch.qos.logback.core.Appender」。該接口的重要方法總結以下:java

package ch.qos.logback.core;
import ch.qos.logback.core.spi.ContextAware;
import ch.qos.logback.core.spi.FilterAttachable;
import ch.qos.logback.core.spi.LifeCycle;
public interface Appender<E> extends LifeCycle, ContextAware,
FilterAttachable {
public String getName();
public void setName(String name);
void doAppend(E event);
}

Appender 接口裏的多數方法都是 getter 和 setting。值得注意的是 doAppend()方法,它惟一的參數是類型E的對象。類型E的實際類型視 logback模塊的不一樣而不一樣。在 logback-classic模塊裏,E 多是「ILoggingEvent」類型;在 logback-access 模塊裏,E 多是「AccessEvent」類型。doAppend()方法也許是 logback 框架裏最重要的方法,它負責以適當的格式將記錄事件輸出到合適的設備。
Appender 是被命名的實體。由於有名字,因此能被引用。Appender 接口擴展了FilterAttachable 接口,所以 appender 實例可被關聯一個或多個過濾器。
Appender 是最終負責輸出記錄事件的組件。然而,它們能夠把實際格式化的任務委託給Layout或Encoder對象。每一個layout/encoder都關聯到一個且僅一個appender。有些appender有內置的或固定的事件格式,所以它們不須要也沒有 layout/encoder。例如,SocketAppender在發送記錄事件以前只是簡單地對其進行序列化。算法

AppenderBase

類 ch.qos.logback.core.AppenderBase 是實現了 Appender 接口的抽象類。AppenderBase提供全部 appender 共享的基本功能,好比設置/獲取名字的方法,其活動狀態和過濾器。
AppenderBase 是 loback 裏全部 appender 的超類。儘管是抽象類,AppenderBase 實際上實現了 Appender 接口的 doAppend()方法。代碼更能說明問題:安全

public synchronized void doAppend(E eventObject) {
// prevent re-entry.
if (guard) {
return;
}
try {
guard = true;
if (!this.started) {
if (statusRepeatCount++ < ALLOWED_REPEATS) {
addStatus(new WarnStatus(
"Attempted to append to non started appender ["
+ name + "].", this));
}
return;
}
if (getFilterChainDecision(eventObject) == FilterReply.DENY)
{
return;
}
// ok, we now invoke derived class' implementation of append
this.append(eventObject);
} catch (Exception e) {
if (exceptionCount++ < ALLOWED_REPEATS) {
addError("Appender [" + name + "] failed to append.", e);
}
} finally {
guard = false;
}
}

這裏的 doAppend()方法的實現是同步的,確保不一樣線程對同一個 appender 的記錄是線程安全的。
這裏進行的同步並不老是合適的,logback 帶了與 AppenderBase 很是類似的類ch.qos.logback.core.UnsynchronizedAppenderBase,以後會討論它。
doAppend()方法作的第一件事就是檢查「guard」是否爲 true。若是是,則當即退出方法。
若是未設置「guard」,緊接下來的語句就把它設爲 true。「guard」確保 doAppend()方法不會遞歸調用本身。
以後的語句裏,咱們檢查「started」字段是否爲 true。若是不是,doAppend()會發出一條警告信息而後返回。換句話說,appender 一旦關閉後,就沒法再向它寫入。Appender 對象實現 LifeCycle 接口,意味着它們實現了 start()、stop()和 isStarted()方法。對 appender 的全部屬性都設值後,Joran 調用 start()方法讓 appender 激活本身的屬性。Appender 也許會啓動失敗,好比由於找不到某些屬性,或者由於不一樣屬性之間互相引用。例如,假設文件建立是截斷模式,那麼,FileAppender 在 Append 選項沒肯定以前不能做用於 File 選項。這種顯式激活步驟確保 appender 在屬性值被肯定以後才能使用屬性。
若是 appender 不能啓動或者已經被中止,則會經過 logback 的內部狀態管理系統發出一條警告消息。嘗試幾回後,爲了不內部狀態系統被同一條警告消息所淹沒,doAppend()方法將中止發出這些警告消息。
接着的 if 語句檢查關聯的過濾器的結果。根據過濾器鏈的判斷結果,事件被拒絕或接受。若是過濾器鏈沒有結果,則事件被默認接受。
doAppend()方法而後調用派生類的append()方法,此方法真正把事件增長到合適的設備。
最後,釋放 guard,容許下一個 doAppend()調用。
在本手冊中,術語「選項(option)」或「屬性(property)」表示用 JavaBeans 內省機制經過 setter 和 getter 方法動態引用的屬性(attribute)。app

Logback-core

Logback-core 是其餘 logback 模塊的基礎。通常來講,logback-core 裏的模塊須要一些細微的定製。不過在下面的幾節理裏,咱們將講述幾個直接可使用的 appender。框架

OutputStreamAppender

OutputStreamAppender 把事件添加到 java.io.OutputStream。該類提供其餘 appender 所需的基本服務。用戶一般不直接實例化 OutputStreamAppender 對象。因爲 java.io.OutputStream通常沒法被方便地映射到字符串,因此沒法在配置文件裏指定目標 OutputStream 對象。簡而言之,你不能在配置文件裏配置 OutputStreamAppender。但這不是說 OutputStreamAppender沒有配置屬性。它的屬性以下。工具

屬性名 類型 描述
encoder Encoder 決定把事件寫入到底層 OutputStreamAppender 的方式。

OutputStreamAppender 是另外三個 appender 的超類:ConsoleAppender、FileAppender及其直接子類 RollingFileAppender。下圖演示了 OutputStreamAppender 和其子類的類圖。
性能

ConsoleAppender

ConsoleAppender把事件添加到控制檯,更準確地說是System.out或 System.err,默認爲前者。ConsoleAppender按照用戶指定的encoder對事件進行格式化。System.out和System.err都是 java.io.PrintStream 類型,所以,它們被包裹在有緩衝 I/O 操做的 OutputStreamWriter 裏。學習

屬性名 類型 描述
encoder Encoder 參見 OutputStreamAppender 屬性
target String 字 符 串 「 System.out 」 或 「 System.err 」。 默 認 爲「System.out」。

下面是使用 ConsoleAppender 的配置示例。
示例:ConsoleAppender 配置
(logback-examples/src/main/java/chapters/appenders/conf/logback-Console.xml)this

<configuration>
    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
        <!--encoders are assigned the type
        ch.qos.logback.classic.encoder.PatternLayoutEncoder by
        default-->
        <encoder>
        <pattern>%-4relative [%thread] %-5level - %msg%n</pattern>
        </encoder>
    </appender>
    <root level="DEBUG">
        <appender-ref ref="STDOUT" />
    </root>
</configuration>

FileAppender

FileAppender 是 OutputStreamAppender 的子類,把記錄事件添加到文件。目標文件經過File 選項指定。若是文件已經存在,則根據 Append 屬性追加或清空文件。操作系統

屬性名 類型 描述
append boolean 若是 true,事件被追加到現存文件尾部。若是 false,清空現存文件。默認爲 true。
encoder Encoder 參見 OutputStreamAppender 屬性file String 被寫入的文件名。若是文件不存在,則建立之。沒有默認值。若是文件的父目錄不存在,FileAppender 會自動建立各級不存在的目錄。
prudent boolean 在 prudent 模式下,FileAppender 將安全地寫入指定文件,即便其餘 FileAppender 實例運行在不一樣 JVM 上,好比運行在不一樣主機上。prudent 默認值爲 false。prudent 模式意味着 Append 屬性自動設爲 true。prudent 模式寫記錄事件時,大約消耗非 prudent 模式的三倍。在一臺「普通」的 PC 上,向本地硬盤寫文件,寫一條記錄事件,非 prudent 模式須要 10 微妙,prudent模式須要 30 微妙。也就是非 prudent 模式每秒記錄100000 條事件,prudent 模式每秒 33000 條。不一樣 JVM 寫入同一個文件時,prudent 模式高效地排列 I/O 操做。因此,因爲訪問文件的 JVM 的數量增長,致使每次 I/O 操做都會有延遲。只要 I/O 操做的總數大約是 20 次記錄請求/秒,就能夠忽略對性能的影響。每秒 100 次或等屢次 I/O 操做會影響性能,此時應當避免prudent 模式。prudent 模式能夠與 RollingFileAppender 聯合使用,但有些限制。

下面是 FileAppender 的配置文件例子。
示例:FileAppender 配置
(logback-examples/src/main/java/chapters/appenders/conf/logback-fileAppender.xml)

<configuration>
<appender name="FILE" class="ch.qos.logback.core.FileAppender">
<file>testFile.log</file>
<append>true</append>
<!--
encoders are assigned the type
ch.qos.logback.classic.encoder.PatternLayoutEncoder by
default
-->
<encoder>
<pattern>%-4relative [%thread] %-5level %logger{35} - %msg%n
</pattern>
</encoder>
</appender>
<root level="DEBUG">
<appender-ref ref="FILE" />
</root>
</configuration>

惟一文件名(用時間戳)

在程序開發期,或對於短生命期程序如批量程序,能夠在個新程序啓動時建立新記錄文件。用 元素能夠輕易作到。舉例以下。
示例:用時間戳實現名稱惟一的 FileAppender
(logback-examples/src/main/java/chapters/appenders/conf/logback-timestamp.xml)

<configuration>
<!--
Insert the current time formatted as "yyyyMMdd'T'HHmmss" under the
key
"bySecond" into the logger context. This value will be available
to
all subsequent configuration elements.
-->
<timestamp key="bySecond" datePattern="yyyyMMdd'T'HHmmss" />
<appender name="FILE" class="ch.qos.logback.core.FileAppender">
<!--
use the previously created timestamp to create a uniquely named
log
file
-->
<file>log-${bySecond}.txt</file>
<encoder>
<pattern>%logger{35} - %msg%n</pattern>
</encoder>
</appender>
<root level="DEBUG">
<appender-ref ref="FILE" />
</root>
</configuration>

timestamp 元素有兩個屬性:key 和 datePattern。屬性 key 是變量名,對餘下的配置元素可用。屬性 datePattern 表示把當前時間(解析配置文件的時間)轉換成字符串時使用的日期模式,聽從 java.text.SimpleDateFormat 裏的約定。

RollingFileAppender

RollingFileAppender 繼承 FileAppender,可以滾動記錄文件。例如,RollingFileAppender能先記錄到文件「log.txt」,而後當符合某個條件時,變成記錄到其餘文件。RollingFileAppender 有兩個與之互動的重要子組件。第一個是 RollingPolicy,負責滾動。
第二個是 TriggeringPolicy,決定是否以及什麼時候進行滾動。因此,RollingPolicy 負責「什麼」,TriggeringPolicy 負責「什麼時候」。

要想 RollingFileAppender 起做用,必須同時設置 RollingPolicy 和 TriggeringPolicy。不過,若是 RollingPolicy 也實現了 TriggeringPolicy 接口,那麼只須要設置 RollingPolicy。
下面是 RollingFileAppender 的可用屬性。

屬性名 類型 描述
file String 參加 FileAppender 屬性
append boolean 參加 FileAppender 屬性
encoder Encoder 參見 OutputStreamAppender 屬性
rollingPolicy RollingPolicy 當發生滾動時,決定 RollingFileAppender 的行爲。
triggeringPolicy TriggeringPolicy 告知 RollingFileAppender 什麼時候激活滾動。
prudent boolean prudent 模式下不支持 FixedWindowRollingPolicy。RollingFileAppender 支 持 prudent與TimeBasedRollingPolicy 的聯合使用,但有兩個限制:1. 在 prudent 模式,不支持也不容許文件壓縮(不能在一個 JVM 壓縮文件時,讓另外一個 JVM 寫文件)。2. 不能設置 FileAppender 的 file 屬性,必須留空。實際上,多數操做系統不容許當一個進程打開文件時又重命名該文件。參加 FileAppender 屬性。

滾動策略概述

RollingPolicy 負責滾動步驟,涉及文件移動和重命名。
RollingPolicy 接口以下:

package ch.qos.logback.core.rolling;
import ch.qos.logback.core.FileAppender;
import ch.qos.logback.core.rolling.helper.CompressionMode;
import ch.qos.logback.core.spi.LifeCycle;
public interface RollingPolicy extends LifeCycle {
public void rollover() throws RolloverFailure;
public String getActiveFileName();
public CompressionMode getCompressionMode();
public void setParent(FileAppender appender);
}

rollover 方法完成對當前記錄文件的歸檔工做。getActiveFileName()方法計算當前記錄文件(寫實時記錄的地方)的文件名。如 getCompressionMode()方法名所示,RollingPolicy 也負責決定壓縮模式。最後,RollingPolicy 經過 setParent()方法獲得一個對其父的引用。

FixedWindowRollingPolicy

當發生滾動時,FixedWindowRollingPolicy 根據以下固定窗口(window)算法重命名文件。
選項「fileNamePattern」表明歸檔(滾動)記錄文件的文件名模式。該選項是必需的,且必需在模式的某處包含標誌「%i」。
下面是 FixedWindowRollingPolicy 的可用屬性。

屬性名 類型 描述
minIndex int 窗口索引的最小值
maxIndex int 窗口索引的最大值
fileNamePattern String 例如,對於最小值和最大值分別是 1 和 3 的文件名模式「MyLogFile%i.log」,會產生歸檔文件 MyLogFile1.log、MyLogFile2.log 和 MyLogFile3.log。該 屬 性 還 可 以 指 定 文 件 壓 縮 選 項 。 例 如「MyLogFile%i.log.zip」表示歸檔文件必須用 zip 格式進行壓縮;還支持「.gz」格式。

因爲固定窗口滾動策略須要的文件重命名操做與窗口大小同樣多,因此強烈建議不要使用太大的窗口大小。當用戶指定過大的窗口大小時,當前的代碼會自動將窗口大小設爲 12。讓咱們來看固定窗口滾動策略的一個更具體的例子。假設「minIndex」是 1, 「maxIndex」是 3,「fileNamePatter」是「foo%i.log」。

滾動文件數量 活動輸出
0 foo.log
1 foo.log
2 foo.log
3 foo.log
4 foo.log

下面的配置文件演示了 RollingFileAppender 和 FixedWindowRollingPolicy。注意「file」選項是必需的,即便它與「fileNamePattern」選項有部分重疊信息。
示例:使用 FixedWindowRollingPolicy 的 RollingFileAppender 的示例配置
(logback-examples/src/main/java/chapters/appenders/conf/logback-RollingFixedWindow.xml)

<configuration>
<appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>testFile.log</file>
<rollingPolicy
class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
<fileNamePattern>testFile.%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>

TimeBasedRollingPolicy

TimeBasedRollingPolicy 或許是最受流行的滾動策略。它根據時間來制定滾動策略,例如 根 據 日 或 月 。TimeBasedRollingPolicy 既 負 責 滾 動 也 負 責 觸 發 滾 動 。 實 際 上 ,TimeBasedRollingPolicy 同時實現了 RollingPolicy 接口和 TriggeringPolicy 接口。
TimeBasedRollingPolicy 有兩個屬性:必需的「fileNamePattern」和可選的「maxHistory」。

屬性名 類型 描述
fileNamePattern String 必需。定義滾動(歸檔)記錄文件的名字。其值應當包含文件名及「%d」格式轉換符。「%d」能夠包含一個java.text.SimpleDateFormat 指定的日期時間模式。若是沒有指定日期時間模式,則默認爲 yyyy-MM-dd。RollingFileAppender(TimeBasedRollingPolicy 之父)的「file」選項無關緊要。經過設置「file」屬性,能夠爲活動文件和歸檔文件指定不一樣的位置。當前記錄老是被指向由「file」屬性指定的文件。若是有「file」屬性,則活動文件的名字不會改變。而若是沒有「file」屬性,則活動文件的名字會根據「fileNamePattern」的值每隔一段時間就從新計算一次。下面的例子會解釋這點。「 %d{} 」 裏 的 日 期 時 間 模 式 遵 循java.text.SimpleDateFormat 的約定。在 FileNamePattern或日期時間模式裏的前置「/」或後置「」會被看成目錄分隔符。
maxHistory int 控制被保留的歸檔文件的最大數量,超出數量就刪除舊文件。例如,假設每個月滾動,且 maxHistory 是 6,則只保留最近 6 個月的歸檔文件,刪除以前的文件。注意當刪除舊歸檔文件時,那些爲了歸檔而建立的目錄也會被刪除。

下面是 fileNamePattern 的部分值及其做用。

fileNamePattern 滾動計劃 示例
/wombat/foo.%d 天天滾動(在午夜)。由於%d沒有指定日期時間格式,因此使用默認的yyyy-MM-dd,即天天滾動。 未設置 file 屬性:在 2006 年11 月 23 日,記錄會輸出到文件/wombat/foo.2006-11-23。在午夜及以後的 24 日,輸出到文件/wombat/foo.2006-11-24。設 置 file 屬 性 爲/wombat/foo.txt:活動記錄文件 總 是 /wombat/foo.txt.。 在2006 年 11 月 23 日,記錄會輸出到文件/wombat/foo.txt。在午夜,/wombat/foo.txt 被重命 名 爲/wombat/foo.2006-11-23,建立新的/wombat/foo.txt,以後的24 日 , 輸 出 到 文 件/wombat/foo.txt。
/wombat/%d{yyyy/MM}/foo.txt 每個月初滾動 未設置 file 屬性:在 2006 年10 月,記錄會輸出到文件/wombat/2006/10/foo.txt 。 在10 月 31 日午夜及 11 月,輸出到文件/wombat/2006/11/foo.txt。設 置 file 屬 性 爲/wombat/foo.txt:活動記錄文件 總 是 /wombat/foo.txt.。 在2006 年 10 月,記錄會輸出到文件/wombat/foo.txt。在 10月31 日午夜,/wombat/foo.txt被 重 命 名 爲/wombat/2006/10/foo.txt,建立新的/wombat/foo.txt,以後的1 個 月 , 輸 出 到 文 件/wombat/foo.txt。在 11 月 30日的午夜,/wombat/foo.txt 被重 命 名 爲/wombat/2006/11/foo.txt,依此類推
/wombat/foo.%d{yyyy-ww}.log 每週初滾動。 注意每週的第一天是星期幾取 決 於 地 區(locale)同前,只是滾動發生在每週的開頭。
/wombat/foo.%d{yyyy-MM-dd_HH}.log 每小時滾動 同前,只是滾動發生在每小時的開頭
/wombat/foo.%d{yyyy-MM-dd_HH-mm}.log 每分鐘滾動 同前,只是滾動發生在每分鐘的開頭。

全部「」和「/」都被解釋爲目錄分隔符。任何須要的目錄都會被建立。因此你能夠輕鬆地把記錄文件放到不一樣的目錄。
正如 FixedWindowRollingPolicy,TimeBasedRollingPolicy 支持自動壓縮文件。若是「fileNamePattern」選項以「.gz」或「.zip」結尾,就表示須要壓縮。

屬性名 類型 描述
/wombat/foo.%d.gz 天天滾動(在午夜),歸檔文件被自動壓縮爲GZIP 文件。 未設置 file 屬性:在 2006 年 11 月 23 日,記錄會輸出到 文 件 /wombat/Foo.2006-11-23 。 在 午 夜 ,/wombat/foo.txt 被壓縮爲/wombat/foo.2009-11-23.gz,以後的 24 日,輸出到文件/wombat/foo.2006-11-24。設置 file 屬性爲/wombat/foo.txt:活動記錄文件老是/wombat/foo.txt.。在 2006 年 11 月 23 日,記錄會輸出到 文 件 /wombat/foo.txt 。 在 午 夜 , 在 午 夜 ,/wombat/foo.txt 被壓縮爲/wombat/foo.2009-11-23.gz,建立新的/wombat/foo.txt,以後的 24 日,輸出到文件/wombat/foo.txt。

屬性「fileNamePattern」有兩個目的。一是,經過學習模式,logback 計算滾動週期。二是,計算每一個歸檔文件的名稱。注意,能夠爲兩種不一樣的模式指定同一個週期。模式 yyyy-MM和 yyyy@MM 都表示每個月滾動,但它們的歸檔文件名不一樣。
經過設置「file」屬性,你能夠爲活動記錄文件和歸檔記錄文件指定不一樣的位置。記錄輸出會被指向「file」屬性指定的文件,因此活動文件的名字不會改變。然而,若是沒有「file」
屬性,則活動文件的名字會根據「fileNamePattern」的值每隔一段時間就從新計算一次。
屬性「maxHistory」控制被保留的歸檔文件的最大數量,超出數量就刪除舊文件。例如,假設每個月滾動,且 maxHistory 是 6,則只保留最近 6 個月的歸檔文件,刪除以前的文件。注意當刪除舊歸檔文件時,那些爲了歸檔而建立的目錄也會被刪除。
出於某些技術緣由,滾動不是時鐘驅動,而是按照記錄事件的到達時間。好比,在 2002年 3 月 8 日,假設「fileNamePattern」是「yyyy-MM-dd」(每日滾動),則午夜事後的第一個記錄事件會觸發滾動。若是,好比說直到 0 點 23 分 47 秒以前都沒有記錄事件,那麼滾動發生的實際時間是 3 月 9 日 0 點 23 分 47 秒,而不是 0 點 0 分。所以,根據事件到達的頻率,滾動或許會被延時觸發。不過,在某個時期內產生的全部記錄事件都被輸出到劃分該時期的正確的文件,從這個角度看,雖然有延遲,滾動算法仍然是正確的。
下面是 RollingFileAppender 和 TimeBasedRollingPolicy 合做的例子。
示例:使用 TimeBasedRollingPolicy 的 RollingFileAppender 的配置例子
(logback-examples/src/main/java/chapters/appenders/conf/logback-RollingTimeBased.xml)

<configuration>
<appender name="FILE"
class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>logFile.log</file>
<rollingPolicy
class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!-- daily rollover -->
<fileNamePattern>logFile.%d{yyyy-MM-dd}.log</fileNamePattern>
<!-- keep 30 days worth of history -->
<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>

下面是在 prudent 模式下,使用 TimeBasedRollingPolicy 的 RollingFileAppender 的配置
例子。
示例:使用 TimeBasedRollingPolicy 的 RollingFileAppender 的配置例子
(logback-examples/src/main/java/chapters/appenders/conf/logback-PrudentTimeBasedRollin
g.xml)

<configuration>
<appender name="FILE"
class="ch.qos.logback.core.rolling.RollingFileAppender">
<!-- Support multiple-JVMs writing to the same log file -->
<prudent>true</prudent>
<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>

基於大小和時間的歸檔

有時你也許想按照日期進行歸檔的同時限制每一個記錄文件的大小,特別是當後處理工具
對記錄 文件大 小有 限制時 。Logback 爲 此提 供了 SizeAndTimeBasedFNATP ,它是
TimeBasedRollingPolicy 的子組件,FNATP 表明「文件命名和觸發策略」。
下面的例子演示了基於大小和時間的記錄文件歸檔。
示例:SizeAndTimeBasedFNATP 配置
(logback-examples/src/main/java/chapters/appenders/conf/logback-sizeAndTime.xml)

<configuration>
<appender name="ROLLING"
class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>mylog.txt</file>
<rollingPolicy
class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!-- rollover daily -->
<fileNamePattern>mylog-%d{yyyy-MM-dd}.%i.txt</fileNamePattern>
<timeBasedFileNamingAndTriggeringPolicy
class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<!-- or whenever the file size reaches 100MB -->
<maxFileSize>100MB</maxFileSize>
</timeBasedFileNamingAndTriggeringPolicy>
</rollingPolicy>
<encoder>
<pattern>%msg%n</pattern>
</encoder>
</appender>
<root level="debug">
<appender-ref ref="ROLLING" />
</root>
</configuration>

注意「%d」後面的「%i」。在當前時間週期結束以前,每當當前記錄文件達到「maxFileSize」時,就會用遞增索引歸檔,索引從 0 開始。
基於大小和時間的歸檔支持刪除舊歸檔文件。你須要用「maxHistory」屬性指定要保留的週期的數量。當程序中止並重啓時,記錄會從正確的位置繼續,即當前週期的最大索引。

觸發策略概述

TriggeringPolicy 負責指示 RollingFileAppender 在何時滾動。
TriggeringPolicy 接口只有一個方法。

package ch.qos.logback.core.rolling;
import java.io.File;
import ch.qos.logback.core.spi.LifeCycle;
public interface TriggeringPolicy<E> extends LifeCycle {
public boolean isTriggeringEvent(final File activeFile, final E
event);
}

isTriggeringEvent()方法有兩個參數,一個是歸檔文件,一個是當前正被處理的記錄事件。
該方法的具體實現根據這兩個參數來決定是否進行滾動。
使用最普遍的觸發策略是 TimeBasedRollingPolicy,它也是一個滾動策略,上節已講過。

SizeBasedTriggeringPolicy

查看當前活動文件的大小。若是超過指定大小,SizeBasedTriggeringPolicy 會告訴RollingFileAppender 去觸發當前活動文件的滾動。
SizeBasedTriggeringPolicy 只有一個參數:maxFileSize,默認值是 10MB。
根據數字後面不一樣的後綴,「maxFileSize」能夠是 bytes、KB、MB或 GB。好比 5000000,5000KB、5MB和 2GB都是合法值,且前三個等價。
下面是 RollingFileAppender 與 SizeBasedTriggeringPolicy 合做的配置例子,當記錄文件的大小超過 5MB後,會觸發滾動。
示例:使用 SizeBasedTriggeringPolicy 的 RollingFileAppender 的配置
(logback-examples/src/main/java/chapters/appenders/conf/logback-RollingSizeBased.xml)

<configuration>
<appender name="FILE"
class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>test.log</file>
<rollingPolicy
class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
<fileNamePattern>test.%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>

Logback Classic

Logback Access

相關文章
相關標籤/搜索