上一篇:http://www.reibang.com/p/824d5396d9ec
1. 變量作用范圍(logback scopes)
在Logback中雹嗦,變量有三種不同的scope:local scope 间景,context scope,system scope寨典。
在變量替換的時候调鬓,首先從local scope中找认然,然后是context scope,然后是system properties中找漫萄,最后是操作系統(tǒng)環(huán)境變量中找卷员。
可以在<property> <define> <insertFromJNDI>元素中使用scope屬性,它的屬性值可以是:local腾务,context毕骡,system。如果不指定岩瘦,默認是local未巫。
<configuration>
<property scope="context" name="nodeId" value="firstNode" />
<appender name="FILE" class="ch.qos.logback.core.FileAppender">
<file>/opt/${nodeId}/myApp.log</file>
<encoder>
<pattern>%msg%n</pattern>
</encoder>
</appender>
<root level="debug">
<appender-ref ref="FILE" />
</root>
</configuration>
2. 變量之間可以引用
USER_HOME=/home/sebastien
fileName=myApp.log
destination=${USER_HOME}/${fileName}
3. 條件判斷啟用不同的logback配置
兩種不同的格式:
<!-- if-then form -->
<if condition="some conditional expression">
<then>
...
</then>
</if>
<!-- if-then-else form -->
<if condition="some conditional expression">
<then>
...
</then>
<else>
...
</else>
</if>
4. 引用公共配置
有時候,在多個項目開發(fā)中启昧,日志的配置有一部分是統(tǒng)一的配置叙凡,可以把這些公共的配置提取到一個公共的配置文件中,在主配置文件中引用這個公共配置的文件密末。
比如一個主配置文件為:
<configuration>
<include file="src/main/java/chapters/configuration/includedConfig.xml"/>
<root level="DEBUG">
<appender-ref ref="includedConsole" />
</root>
</configuration>
公共配置文件為:
<included>
<appender name="includedConsole" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>"%d - %m%n"</pattern>
</encoder>
</appender>
</included>
- 注意握爷,這里的<included>標記是不能少的。
引用文件的方式有三種:
- 從文件路徑中引用
<include file="src/main/java/chapters/configuration/includedConfig.xml"/>
- 從classpath中引用
<include resource="includedConfig.xml"/>
- 從URL中引用
<include url="http://some.host.com/includedConfig.xml"/>
如果引用的文件是可有可無的苏遥,則可以把它定義為可選擇的:
<include optional="true" ..../>
5. 緩存日志輸出饼拍,提高日志吞吐量
如果日志允許丟失赡模,把Appender中的immediateFlush設置為false田炭,可以明顯提高日志的吞吐量。
6. 每次啟動都創(chuàng)建一個日志文件
在一些不是常駐內(nèi)存的應用中漓柑,每次啟動應用都創(chuàng)建一個新的日志文件是非常合適的教硫。可以使用<timestamp>標簽實現(xiàn)辆布。
<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>
datePattern配置的值只要可以被SimpleDateFormat轉(zhuǎn)化就可以瞬矩。
7. RollingFileAppender
RollingFileAppender有兩個重要的組件:RollingPolicy 和 TriggeringPolicy。前者決定如何滾動日志文件锋玲,需要一種策略景用,后者決定何時開始滾動日志文件,需要的是一個觸發(fā)點惭蹂。
7.1 TimeBasedRollingPolicy
這是一個常見的日志滾動策略伞插,它基于時間滾動,比如每天生成一個日志文件盾碗,或每月生成一個日志文件媚污。它同時實現(xiàn)了RollingPolicy 和 TriggeringPolicy接口。在TimeBasedRollingPolicy可以配置下面這些屬性:
- fileNamePattern 日志文件名樣式
這是一個必須配置的屬性廷雅。它定義每次滾動日志文件時耗美,日志文件名稱的生成方式京髓。它一般由占位符%d和日志名組成。%d可以指定日期和時間商架,由java.text.SimpleDateFormat進行格式化堰怨。如果只有%d,它默認使用yyyy-MM-dd的日期格式蛇摸。在RollingFileAppender中诚些,<file>標簽是可以省略的,如果設置了file的值皇型,當前的日志都會輸入到這個file配置的文件中诬烹。它可以將當前輸出的日志文件和滾動歸檔的日志文件分離。如果不配置file標簽弃鸦,則隨著時間的變化绞吁,當前輸出的日志會創(chuàng)建新的日志文件。
如果在一個fileNamePattern標簽下用到多個%d唬格,剛只能有一個是做為滾動日志文件的日期判斷家破。其它的都只能是輔助的。例如购岗,每天生成一個日志文件汰聋,每個月的日志文件放在一起:
/var/log/%d{yyyy/MM, aux}/myapplication.%d{yyyy-MM-dd}.log
在配置中,也可以指定時區(qū)喊积,比如:
Folder/test.%d{yyyy-MM-dd-HH, UTC}.log
如果指定的時區(qū)不存在烹困,或沒有指定,默認使用GMT時區(qū)乾吻。
maxHistory 保留的歷史日志文件最大數(shù)量
比如你配置的是每天生成一個日志文件髓梅,maxHistory配置的是6,那么就會只保留6個日志文件绎签,即六天的日志枯饿。如果是每月生成一個日志文件,則是保留6個月的日志文件诡必,因為一個日志文件記錄一個月的日志奢方。當日志文件超過這個數(shù)量時,最早的日志文件會被異步刪除爸舒。totalSizeCap
這個屬性限制保留的日志總大小蟋字,如果日志文件總的大小超過這個限制,就會異步刪除最早的日志文件碳抄。這個屬性需要配合maxHistory一起使用愉老,logback會首先判斷maxHistory,然后再計算日志總量是否超過這個限制剖效。cleanHistoryOnStart
這個屬性默認是false嫉入,如果設置為true焰盗,則應用啟動的時候都會刪除以前舊的日志。
在開發(fā)環(huán)境下可以配置為true咒林。
下面是一些常見的格式配置:
日志文件樣式配置 | 例子說明 |
---|---|
/log/foo.%d | 1. 當不設置<file>標簽時熬拒,如果現(xiàn)在的日期是2020-05-23,當前的日志會輸出到/log/foo.2020-05-20的日志文件中垫竞,過了24點之后澎粟,會輸出到/log/foo.2020-05-20的日志文件中。2. 如果設置file標簽為:<file>/log/foo.log</file>欢瞪,當前日志會輸出到/log/foo.log文件中活烙,過了24點之后,foo.log會重命名為/log/foo.2020-05-23遣鼓,然后重新創(chuàng)建一個/log/foo.log文件啸盏,當前日志會輸出到新的文件中。 |
/log/%d{yyyy/MM}/foo.txt | 每月生成一個新的日志文件骑祟,設置與不設置file和上面的一樣回懦。 |
/log/foo.%d{yyyy-ww}.log | 每周生成一個日志文件。 |
/log/foo%d{yyyy-MM-dd_HH}.log | 每小時生成一個日志文件 |
/log/foo%d{yyyy-MM-dd_HH-mm}.log | 每分鐘生成一個日志文件 |
/log/%d{yyyy-MM,aux}/%d.log | 每天生成一個日志文件次企,舊的文件歸檔到年月的文件夾里面怯晕,比如2020-05。 |
如果配置的文件路徑不存在缸棵,logback會自動創(chuàng)建舟茶。
TimeBasedRollingPolicy 支持自動壓縮,如果配置的fileNamePattern以.gz或.zip結(jié)尾蛉谜,就會自動壓縮稚晚。
例如 :/log/foo.%d.zip
下面是一個配置示例:
<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 capped at 3GB total size -->
<maxHistory>30</maxHistory>
<totalSizeCap>3GB</totalSizeCap>
</rollingPolicy>
<encoder>
<pattern>%-4relative [%thread] %-5level %logger{35} - %msg%n</pattern>
</encoder>
</appender>
<root level="DEBUG">
<appender-ref ref="FILE" />
</root>
</configuration>
如果想支持多個JVM進程向同一個日志文件中寫日志,設置prudent參數(shù)為true:
<configuration>
<appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<!-- Support multiple-JVM 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>
<totalSizeCap>3GB</totalSizeCap>
</rollingPolicy>
<encoder>
<pattern>%-4relative [%thread] %-5level %logger{35} - %msg%n</pattern>
</encoder>
</appender>
<root level="DEBUG">
<appender-ref ref="FILE" />
</root>
</configuration>
7.2 Size and time based rolling policy
有時候希望日志既按天分割型诚,又按大小分割,比如當日志文件不足1G的時候鸳劳,每天創(chuàng)建一個新的日志文件狰贯,同一天內(nèi),如果日志文件大小超過1G的時候赏廓,也創(chuàng)建一個新的日志文件涵紊。就可以使用這個SizeAndTimeBaseRollingPolicy。
<configuration>
<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>
<root level="DEBUG">
<appender-ref ref="ROLLING" />
</root>
</configuration>
- 注意幔摸,這里面的配置中摸柄,%d和%i都是必不可少的。
7.3 SizeBasedTriggeringPolicy
這個觸發(fā)策略只有一個參數(shù)既忆,maxFileZie驱负,默認是10MB嗦玖,當文件達到配置的大小時,就分觸發(fā)日志分割跃脊,創(chuàng)建新的日志文件宇挫。它支持的單位有:KB,MB,GB酪术。
在使用這個策略時器瘪,fileNamePattern必須有%i。