既然使用Logback麸祷,應該對它多些了解(二)

上一篇: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>標記是不能少的。

引用文件的方式有三種:

  1. 從文件路徑中引用
 <include file="src/main/java/chapters/configuration/includedConfig.xml"/>
  1. 從classpath中引用
<include resource="includedConfig.xml"/>
  1. 從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。

最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末绘雁,一起剝皮案震驚了整個濱河市橡疼,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌庐舟,老刑警劉巖衰齐,帶你破解...
    沈念sama閱讀 219,427評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異继阻,居然都是意外死亡耻涛,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,551評論 3 395
  • 文/潘曉璐 我一進店門瘟檩,熙熙樓的掌柜王于貴愁眉苦臉地迎上來抹缕,“玉大人,你說我怎么就攤上這事墨辛∽垦校” “怎么了?”我有些...
    開封第一講書人閱讀 165,747評論 0 356
  • 文/不壞的土叔 我叫張陵睹簇,是天一觀的道長奏赘。 經(jīng)常有香客問我,道長太惠,這世上最難降的妖魔是什么磨淌? 我笑而不...
    開封第一講書人閱讀 58,939評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮凿渊,結(jié)果婚禮上梁只,老公的妹妹穿的比我還像新娘。我一直安慰自己埃脏,他們只是感情好搪锣,可當我...
    茶點故事閱讀 67,955評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著彩掐,像睡著了一般构舟。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上堵幽,一...
    開封第一講書人閱讀 51,737評論 1 305
  • 那天狗超,我揣著相機與錄音弹澎,去河邊找鬼。 笑死抡谐,一個胖子當著我的面吹牛裁奇,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播麦撵,決...
    沈念sama閱讀 40,448評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼刽肠,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了免胃?” 一聲冷哼從身側(cè)響起音五,我...
    開封第一講書人閱讀 39,352評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎羔沙,沒想到半個月后躺涝,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,834評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡扼雏,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,992評論 3 338
  • 正文 我和宋清朗相戀三年坚嗜,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片诗充。...
    茶點故事閱讀 40,133評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡苍蔬,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出蝴蜓,到底是詐尸還是另有隱情碟绑,我是刑警寧澤,帶...
    沈念sama閱讀 35,815評論 5 346
  • 正文 年R本政府宣布茎匠,位于F島的核電站格仲,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏诵冒。R本人自食惡果不足惜凯肋,卻給世界環(huán)境...
    茶點故事閱讀 41,477評論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望造烁。 院中可真熱鬧否过,春花似錦、人聲如沸惭蟋。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,022評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽告组。三九已至,卻和暖如春癌佩,著一層夾襖步出監(jiān)牢的瞬間木缝,已是汗流浹背便锨。 一陣腳步聲響...
    開封第一講書人閱讀 33,147評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留我碟,地道東北人放案。 一個月前我還...
    沈念sama閱讀 48,398評論 3 373
  • 正文 我出身青樓,卻偏偏與公主長得像矫俺,于是被迫代替她去往敵國和親吱殉。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 45,077評論 2 355

推薦閱讀更多精彩內(nèi)容