用SLF4j/Logback打印日誌-2
本篇主要介紹logback的輸出源配置,logback默認提供了很多輸出源,但是用的最多的是這幾種:
- OutputStreamAppender 日誌輸出到一個二進制流,可以通過 <encoder/> 配置編碼
- ConsoleAppender 日誌輸出到控制臺,可以通過 <encoder/>配置編碼,通過設置target (System.out or System.err.)來指定輸出方向。
- FileAppender 日誌輸出到文件,有下面這些可以配置的屬性
- append (boolean) 是追加還是覆蓋的方式寫日誌,默認true,追加
- encoder (Encoder)
- file (String) 指定日誌文件的位置
- prudent (boolean) 這個模式是用來解決多進程log輸出問題的,如果有多個輸出源在不同的進程log寫入同一份日誌,那麽會出現文件的問題。打開這種模式,會
給文件加鎖,然後讓事件順序寫入,文件鎖會導致性能問題,一般情況下每秒20條日誌的時候沒有什麽問題,但是每秒100條日誌的時候回出現顯著的性能問題。
最後也是用的最多的是RollingFileAppender,最牛逼的輸出源!!它可以配置的屬性如下:
- file(String) 指定日誌文件的位置
- append(boolean) 是追加還是覆蓋的方式寫日誌,默認true,追加
- encoder(Encoder) 控制編碼即布局
- prudent(boolean) 同FileAppender
- rollingPolicy(RollingPolicy)
- triggeringPolicy(TriggeringPolicy)
它有兩個最核心的屬性:RollingPolicy 和 TriggeringPolicy,前者定義滾動的策略,後者定義滾動的時機。這種類型的輸出源用的多是因為在後端系統中,日誌是持續不斷的打印的,單個日誌文件的大小受限,所以它提供了一種機制可以根據時間自動歸檔舊的日誌文件,然後創建新的日誌文件打印日誌,並且可以設置策略刪除太舊的日誌。一個典型的場景是:我們可以設置logback每天生成一個新的日誌文件,並把昨天的日誌文件歸檔,並且最多保存七天的日誌,超出七天的自動刪除。
滾動策略 - RollingPolicy
1. TimeBasedRollingPolicy 是目前最受歡迎的一種滾動方式,可以設置按天、按月的滾動。它同時實現了 RollingPolicy 和 TriggeringPolicy 接口。它可以配置這些屬性:
-
fileNamePattern (String) 比如:/var/log/%d{yyyy/MM, aux}/myapplication.%d{yyyy-MM-dd}.log ,這裏最重要的是 %d{},用它來格式化一個時間日期,作為一個文件名。
- maxHistory (int) 最多保存的日誌數量
- totalSizeCap (int) 限制日誌文件大小,超出之後會先刪除較舊的日誌
- cleanHistoryOnStart (boolean)
註:在RollingFileAppender還是需要設置file屬性來表示當前的寫入日誌的文件,但是當滾動時間到了,會按照fileNamePattern定義的規則來歸檔當前的日誌寫入文件。logback會從
fileNamePattern 中推導出滾動的間隔,上面的例子會按月創建日誌目錄、日誌文件會在每天0點歸檔。
常用的TimeBasedRollingPolicy策略:
1./wombat/foo.%d 每天0點生成一個文件,默認格式 yyyy-MM-dd, 比如:/wombat/foo.2006-11-23
2./wombat/%d{yyyy/MM}/foo.txt 每月滾動一次,比如:/wombat/2006/10/foo.txt
3./wombat/foo.%d{yyyy-ww}.log 每周滾動一次
4./wombat/foo%d{yyyy-MM-dd_HH}.log 每小時滾動一次
5./wombat/foo%d{yyyy-MM-dd_HH-mm}.log 每分鐘滾動一次
註:如果文件名類似 ‘/wombat/foo.%d.gz‘ 這樣,以 ‘gz‘ 或者 ‘zip‘ 結尾,那麽會把文件自動進行壓縮
一個典型的配置(每天滾動一次,最多存30天,所有log大小不能超過3GB):
<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 capped at 3GB total size -->
<maxHistory>30</maxHistory>
<totalSizeCap>3GB</totalSizeCap>
</rollingPolicy>
<encoder>
<pattern>%-4relative [%thread] %-5level %logger{35} - %msg%n</pattern>
</encoder>
</appender>
2. SizeAndTimeBasedRollingPolicy 典型配置如下:
<appender name="ROLLING" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>mylog.txt</file>
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<!-- rollover daily -->
<fileNamePattern>mylog-%d{yyyy-MM-dd}.%i.txt</fileNamePattern>
<!-- each file should be at most 100MB, keep 60 days worth of history, but at most 20GB -->
<maxFileSize>100MB</maxFileSize>
<maxHistory>60</maxHistory>
<totalSizeCap>20GB</totalSizeCap>
</rollingPolicy>
<encoder>
<pattern>%msg%n</pattern>
</encoder>
</appender>
唯一需要註意的是 %i
標記,它的使用場景是這樣的,如果log文件的大小達到了maxFileSize,但是時間還沒有達到滾動點,那麽會創建新的log文件,並用一個遞增的 %i
索引。
3. FixedWindowRollingPolicy 要求文件 fileNamePattern 必須包含 %i標示,這是一個遞增字段,受到 minIndex 和 maxIndex 限制。
<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>
這種方式利用到了 triggeringPolicy,因為它本身無法判斷什麽時候應該產生一個新的文件,所以通過triggeringPolicy來約束。上面的
例子中,當文件大小超過5MB的時候就會觸發一次滾動。
遠端的數據源,比如 SocketAppender and SSLSocketAppender 、SMTPAppender等暫時用不到,不再記錄。
在閱讀官方文檔的時候看到一句話:
"For various technical reasons, rollovers are not clock-driven but depend on the arrival of logging events."
這種方式和友盟的log文件記錄是一樣的,看完之後心有同感!
Refer: https://www.jianshu.com/p/09f55766088d用SLF4j/Logback打印日誌-2