1. 程式人生 > 實用技巧 >logback節點配置詳解

logback節點配置詳解

一 :根節點 <configuration></configuration>

屬性 : debug : 預設為false ,設定為true時,將打印出logback內部日誌資訊,實時檢視logback執行狀態。 scan : 配置檔案如果發生改變,將會重新載入,預設值為true; scanPeriod : 檢測配置檔案是否有修改的時間間隔,如果沒有給出時間單位,預設單位時毫秒,當scan為true時,這個屬性生效,預設時間間隔為1min。
1 <?xml version="1.0" encoding="utf-8"?>
2 1 <configuration 
debug="true" scan="true" scanPeriod="2"> 3 2 <!--TODO : 子節點資訊--> 4 3 </configuration>

可以這樣描述配置檔案的基本結構:以<configuration>開頭,後面有零
個或多個<appender>元素,有零個或多個<logger>元素,有最多一個<root>元素

二:<configuration> 子節點

1 : <appender></appender> 2 : <logger></logger> 3 : <root></root> 1.1 <appender> 是 <configuration> 的子節點,是負責寫日誌的元件。

appender 有兩個必要屬性 name ,class 。name指定appender 的名稱, class 指定appender的全限定名 class 包括 :ch.qos.logback.core.ConsoleAppender /ch.qos.logback.core.FileAppender/ch.qos.logback.core.RollingFileAppender
<?xml version="1.0" encoding="utf-8"?> 
 <configuration debug="true" scan="true" scanPeriod="2">
<!-- conf consoel out --> <appender name ="console_out" class="ch.qos.logback.core.ConsoleAppender"> </appender> <!-- conf file out --> <appender name="file_out" class="ch.qos.logback.core.FileAppender"> </appender> <!-- conf file out --> <appender name="file_out" class="ch.qos.logback.core.RollingFileAppender"> </appender> <root></root> <loger></loger> </configuration>
1.1.1 :ConsoleAppender 把日誌新增到控制檯,有如下節點: <encoder> : 對日誌進行格式化。 <target> : 字串System.out 或者 System.err, 預設 System.out;
<?xml version="1.0" encoding="utf-8"?>
 <configuration>
     <!-- conf consoel out -->
   <appender name ="console_out" class="ch.qos.logback.core.ConsoleAppender">
         <encoder>
             <pattern>%date [%thread] %-5level %logger - %message%newline</pattern>
         </encoder>
   </appender>
 
   <root level="INFO">             
     <appender-ref ref="console_out" />   
   </root>     
 </configuration>
1.1.2 :FileAppender 把日誌新增到檔案,有如下節點: <file> : 被寫入的檔名,可以是相對目錄 , 也可以是絕對目錄 , 如果目錄不存在則會自動建立 <append> : 如果是true , 日誌被追加到檔案結尾 , 如果是false,清空現存檔案 , 預設是true <encoder> : 對日誌進行格式化 [具體的轉換符說明請參見官網.] <prodent> : 如果是true,日誌會被安全的寫入檔案 , 即使其他的FileAppender也會向此檔案做寫入操作 , 預設是false
<?xml version="1.0" encoding="utf-8"?>
<configuration>
    <!-- conf consoel out -->
    <appender name ="console_out" class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
            <pattern>%date [%thread] %-5level %logger - %message%newline</pattern>
        </encoder>
    </appender>

    <!-- conf file out -->
    <appender name="file_out" class="ch.qos.logback.core.FileAppender">
        <file>logs/debug.log</file>
        <encoder>
            <pattern>%date [%thread] %-5level %logger - %message%newline</pattern>
        </encoder>
    </appender>
</configuration>
1.1.3 :RollingFileAppender [常用] 滾動紀錄檔案,先將日誌記錄到指定檔案,當符合某種條件時,將日誌記錄到其他檔案,有如下節點: <file> : 被寫入的檔名,可以是相對目錄,也可以解決目錄,如果目錄不存在則自動建立。 <append> :如果是true,日誌被追加到檔案結尾,如果是false,清空現存檔案,預設是true; <encoder> : 對日誌進行格式化 [具體的轉換符說明請參見官網.] <rollingPolicy> : 當發生滾動時,決定 RollingFileAppender 的行為,涉及檔案移動和重新命名。
  • 1.1.3.1 :
TimeBaseRollingPolicy :最常用的滾動策略,根據時間來制定滾動策略,即負責滾動也負責觸發滾動。有如下節點; 1) : <fileNamePattern> 必要節點,包含檔案及“%d” 轉換符,“%d”可以包含一個java.text.SimpleDateFormat 制定的時間格式,如:%d{yyyy-MM},如果直接使用 %d ,預設格式是 yyyy-MM-dd。 RollingFileAppender 的file 子節點可有可無,通過設定file,可以為活動檔案和歸檔檔案制定不同位置,當前日誌總是紀錄到file指定的檔案,活動檔案的名稱不會改變,如果沒有設定file,活 動檔案 的名稱會根據fileNamePattern的值,每隔一段時間改變一次,“/”或者“\” 會被當作目錄分隔符。 2) :<maxHistory> 可選節點,控制保留的歸檔檔案的最大數量,超出數量就刪除舊檔案,假設設定每個月滾動,且<maxHistory> 是 6,則只儲存最近6個月的檔案,刪除之前的舊檔案,注意:刪除舊檔案是哪些為了歸檔而建立的目錄也會被刪除。 3) :<filenamePattern> 必須包含“%i” 例如:設定最小值,和最大值分別為1和2,命名模式為 log%i.log,會產生歸檔檔案log1.log和log2.log,還可以指定檔案壓縮選項,例如:log%i.log.gz 或者 log%i.log.zip 4) :<triggeringPolicy> : 告知RollingFileAppender 啟用RollingFileAppender滾動
<!-- 03:conf errorAppender out -->
    <appender name="errorAppender" class="ch.qos.logback.core.RollingFileAppender">
        <file>logs/error.log</file>
        <!-- 設定滾動策略 -->
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <!--設定日誌命名模式-->
            <fileNamePattern>errorFile.%d{yyyy-MM-dd}.log</fileNamePattern>
            <!--最多保留30天log-->
            <maxHistory>30</maxHistory>
        </rollingPolicy>
        <!-- 超過150MB時,觸發滾動策略 -->
        <triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
            <maxFileSize>150</maxFileSize>
        </triggeringPolicy>
        <encoder>
            <pattern>%d [%p] %-5level %logger - %msg%newline</pattern>
        </encoder>
    </appender>
  • 1.1.3.2 :
SizeBasedTriggeringPolicy : 檢視當前活動檔案的大小 , 如果超過指定大小會告知 RollingFileAppender , 觸發當前活動滾動 , 只有一個節點 , 用來規定檔案大小 <maxFileSize> : 活動檔案的大小 , 預設10MB <prudent>:當為true時 , 不支援FixedWindowRollingPolicy , 支援TimeBasedRollingPolicy , 但是有兩個限制 , 1不支援也不允許檔案壓縮 , 2不能設定file屬性 . 必須留空 至此 , Appender 節點已經介紹完畢.

2.1 : logger 節點

logger 是 <configuration> 的子節點 來設定某一個包或者具體的某一個類的日誌列印級別,以及指定<appender>, logger 僅有一個name屬性,兩個可選屬性 level/addtivity name : 用來指定受此loger約束的某一個包或者具體的某一個類 level:用來設定列印級別,大小寫無關,TRACE,DEBUG,INFO,WARE,ERROR,ALL和OFF,還有一個特俗值INHERITED 或者 同義詞NULL,代表強制執行上級的級別。 如果未設定此屬性,那麼當前logger將會繼承上級的級別。 level 大小 : ERROR > WARN > INFO > DEBUG > TRACE 程式會列印高於或等於所設定級別的日誌 addtivity : 是否向上級loger傳遞列印資訊,預設為true; <loger> 可以包含零個或多個<appender-ref>元素,表示這個appender將會新增到loger
<?xml version="1.0" encoding="utf-8"?>
<configuration>
    <!-- conf consoel out -->
    <appender name ="console_out" class="ch.qos.logback.core.ConsoleAppender">
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <!-- 過濾掉非INFO級別 -->
            <level>INFO</level>
            <onMatch>ACCEPT</onMatch>
            <onMismatch>DENY</onMismatch>
        </filter>
    </appender>

    <!--  conf infoAppender out -->
    <appender name="infoAppender" class="ch.qos.logback.core.RollingFileAppender">

        <file>logs/info.log</file>
        <!-- 設定滾動策略 -->
        <rollingPoliy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <!--設定日誌命名模式-->
            <fileNamePattern>infoFile.%d{yyyy-MM-dd}.log</fileNamePattern>
            <!--最多保留30天log-->
            <maxHistory>30</maxHistory>
        </rollingPoliy>
        <!-- 超過150MB時,觸發滾動策略 -->
        <triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
            <maxFileSize>150</maxFileSize>
        </triggeringPolicy>
        <encoder>
            <pattern>%d [%p] %-5level %logger - %msg%newline</pattern>
        </encoder>
    </appender>

    <!-- 指定在logback.olf.log包中的log -->
    <logger name="logback.olf.log" level="info">
        <appender-ref ref = "console_out"/>
        <appender-ref ref = "infoAppender"/>
    </logger>
</configuration>
View Code 2.2 : root 節點 元素配置根 logger。該元素有一個 level 屬性。沒有 name 屬性,因為已經被命名 為“root” Level 屬性的值大小寫無關,其值為下面其中一個字串:TRACE、DEBUG、INFO、 WARN、ERROR、ALL 和 OFF。注意不能設定為“INHERITED” 或“NULL”。 元素可以包含零個或多個元素。與元素類似,宣告 元素後,會先關閉然後移除全部當前 appender,只引用聲明瞭的 appender。如果 root 元素沒 有引用任何 appender,就會失去所有 appender。 如下完整案例配置 :
<?xml version="1.0" encoding="utf-8"?>
<configuration>
    <!-- conf consoel out -->
    <appender name ="console_out" class="ch.qos.logback.core.ConsoleAppender">
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <!-- 過濾掉非INFO級別 -->
            <level>INFO</level>
            <onMatch>ACCEPT</onMatch>
            <onMismatch>DENY</onMismatch>
        </filter>
    </appender>

    <!-- 01:conf infoAppender out -->
    <appender name="infoAppender" class="ch.qos.logback.core.RollingFileAppender">

        <file>logs/info.log</file>
        <!-- 設定滾動策略 -->
        <rollingPoliy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <!--設定日誌命名模式-->
            <fileNamePattern>infoFile.%d{yyyy-MM-dd}.log</fileNamePattern>
            <!--最多保留30天log-->
            <maxHistory>30</maxHistory>
        </rollingPoliy>
        <!-- 超過150MB時,觸發滾動策略 -->
        <triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
            <maxFileSize>150</maxFileSize>
        </triggeringPolicy>
        <encoder>
            <pattern>%d [%p] %-5level %logger - %msg%newline</pattern>
        </encoder>
    </appender>

    <!-- 02:conf debugAppender out -->
    <appender name="debugAppender" class="ch.qos.logback.core.RollingFileAppender">
        <file>logs/debug.log</file>
        <!-- 設定滾動策略 -->
        <rollingPoliy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <!--設定日誌命名模式-->
            <fileNamePattern>debugFile.%d{yyyy-MM-dd}.log</fileNamePattern>
            <!--最多保留30天log-->
            <maxHistory>30</maxHistory>
        </rollingPoliy>
        <!-- 超過150MB時,觸發滾動策略 -->
        <triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
            <maxFileSize>150</maxFileSize>
        </triggeringPolicy>
        <encoder>
            <pattern>%d [%p] %-5level %logger - %msg%newline</pattern>
        </encoder>
    </appender>

    <!-- 03:conf errorAppender out -->
    <appender name="errorAppender" class="ch.qos.logback.core.RollingFileAppender">
        <file>logs/error.log</file>
        <!-- 設定滾動策略 -->
        <rollingPoliy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <!--設定日誌命名模式-->
            <fileNamePattern>errorFile.%d{yyyy-MM-dd}.log</fileNamePattern>
            <!--最多保留30天log-->
            <maxHistory>30</maxHistory>
        </rollingPoliy>
        <!-- 超過150MB時,觸發滾動策略 -->
        <triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
            <maxFileSize>150</maxFileSize>
        </triggeringPolicy>
        <encoder>
            <pattern>%d [%p] %-5level %logger - %msg%newline</pattern>
        </encoder>
    </appender>

    <root level="ALL">
        <appender-ref ref="infoAppender"/>
        <appender-ref ref="debugAppender"/>
        <appender-ref ref="errorAppender"/>
    </root>
</configuration>
View Code

三 : <filter> 過濾節點

Logback 的過濾器基於三值邏輯(ternary logic),允許把它們組裝或成鏈,從而組成任 意的複合過濾策略。 這裡的所謂三值邏輯是說,過濾器的返回值只能是 ACCEPT、DENY 和 NEUTRAL 的其中一個。 過濾器一般分為如下幾類 : 3.1 :級別過濾器(LevelFilter) LevelFilter 根據記錄級別對記錄事件進行過濾。如果事件的級別等於配置的級別,過濾 器會根據 onMatch 和 onMismatch 屬性接受或拒絕事件。下面是個配置檔案例子:
<?xml version="1.0" encoding="utf-8"?>
<configuration>
    <!-- conf consoel out -->
    <appender name ="console_out" class="ch.qos.logback.core.ConsoleAppender">
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <!-- 過濾掉非INFO級別 -->
            <level>INFO</level>
            <onMatch>ACCEPT</onMatch>
            <onMismatch>DENY</onMismatch>
        </filter>

        <encoder>
            <pattern>%-4relative [%thread] %-5level %logger{30} - %msg%n</pattern>
        </encoder>
    </appender>
    <root level="DEBUG">
        <appender-ref ref="console_out" />
    </root>
</configuration>
View Code

3.2 :臨界值過濾器(ThresholdFilter)

ThresholdFilter 過濾掉低於指定臨界值的事件 . 當記錄的級別等於或高於臨界值時 , ThresholdFilter 的decide()方法會返回NEUTRAL ; 當記錄級別低於臨界值時 , 事件會被拒絕 下面是個配置檔案例子 :

<?xml version="1.0" encoding="utf-8"?>
<configuration>
    <!-- conf consoel out -->
    <appender name ="console_out" class="ch.qos.logback.core.ConsoleAppender">
        <filter class="ch.qos.logback.classic.filter.ThresholdFilter">          <!-- 過濾掉TRACE和DEBUG級別的日誌 -->
            <level>INFO</level>
        </filter>

        <encoder>
            <pattern>%-4relative [%thread] %-5level %logger{30} - %msg%n</pattern>
        </encoder>
    </appender>
    <root level="DEBUG">
        <appender-ref ref="console_out" />
    </root>
</configuration>
View Code

3.3 :求值過濾器(EvaluatorFilter)

EvaluatorFilter 封裝了 EventEvaluator(ch.qos.logback.core.boolex.EventEvaluator) , 評估 是否符合指定的條件

<?xml version="1.0" encoding="utf-8"?>
<configuration>
    <!-- conf consoel out -->
    <appender name ="console_out" class="ch.qos.logback.core.ConsoleAppender">
        <filter class="ch.qos.logback.classic.filter.EvaluatorFilter">
             <evaluator>
             <!--過濾掉所有日誌中不包含hello字元的日誌-->
                <expression>
                    message.contains("hello")
                </expression>
                <onMatch>NEUTRAL</onMatch>
                <onMismatch>DENY</onMismatch>
             </evaluator>
        </filter>

        <encoder>
            <pattern>%-4relative [%thread] %-5level %logger{30} - %msg%n</pattern>
        </encoder>
    </appender>
    <root level="DEBUG">
        <appender-ref ref="console_out" />
    </root>
</configuration>
View Code

3.4 :匹配器(Matchers)

儘管能通過呼叫 String 類的 matches()方法進行模式匹配,但這會導致每次呼叫過濾器 時都會建立一個全新的 Pattern 物件。為消除這種開銷,你可以預先定義一個或多個 Matcher 物件。一旦定義 matcher 後,就可以在求值表示式裡重複引用它。

<?xml version="1.0" encoding="utf-8"?>
<configuration>
    <!-- conf consoel out -->
    <appender name ="console_out" class="ch.qos.logback.core.ConsoleAppender">
        <filter class="ch.qos.logback.classic.filter.EvaluatorFilter">
             <evaluator>
                <matcher>
                    <Name>odd</Name>
                    <!-- 過濾掉序號為奇數的語句-->
                    <regex>statement [13579]</regex>
                </matcher>
                <expression>odd.matches(formattedMessage)</expression>
                <onMatch>NEUTRAL</onMatch>
                <onMismatch>DENY</onMismatch>
             </evaluator>
        </filter>

        <encoder>
            <pattern>%-4relative [%thread] %-5level %logger{30} - %msg%n</pattern>
        </encoder>
    </appender>
    <root level="DEBUG">
        <appender-ref ref="console_out" />
    </root>
</configuration>
View Code

logback 執行流程 :

1 :獲得過濾鏈的策略

依據過濾器鏈返回的結果做出不同的響應。共有三個響應結果:
FilterReply.DENY, 直接退出,不執行後續流程
FilterReply.NEUTRA,繼續向下執行
FilterReply.ACCEPT,不進行步驟二,即型別輸出型別檢查

2 :執行基本的選擇規則

主要是比較下level,如果級別低直接退出後續執行

3 :建立LoggingEvent物件

這個物件包裹一些基本資訊,包括日誌界別,資訊本身,可能的異常資訊,執行時間,執行執行緒,其實一些隨日誌請求一起發出的資料和MDC。其中MDC是用來裝一些額外的上下文資訊的。

4 :呼叫appenders

此時logback會呼叫appender的doAppender,如果appender裡有一些filer的話,此時也會呼叫

5 :格式化輸出結果

通常情況下都是由layout層將event格式化成String型。當然也有意外比如說SocketAppender就是將event格式化成流。

6 :.輸出LoggingEvent

將格式化好的結果,輸出到appender中記錄的地址

注 : 標準logback .xml 配置示例:

  MaxHistory指的是檔案數量,超過MaxHistory數量才會刪除,只有當每天生成且只生成一個檔案時才表示保留天數

 1 <?xml version="1.0" encoding="UTF-8"?>
 2 <configuration debug="false">
 3     <!--設定儲存路徑變數-->
 4     <property name="LOG_HOME" value="./log"/>
 5 
 6     <!--控制檯輸出appender-->
 7     <appender name="console" class="ch.qos.logback.core.ConsoleAppender">
 8         <!--設定輸出格式-->
 9         <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
10             <!--格式化輸出:%d表示日期,%thread表示執行緒名,%-5level:級別從左顯示5個字元寬度%msg:日誌訊息,%n是換行符-->
11             <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
12             <!--設定編碼-->
13             <charset>UTF-8</charset>
14         </encoder>
15     </appender>
16 
17     <!--檔案輸出,時間視窗滾動-->
18     <appender name="timeFileOutput" class="ch.qos.logback.core.rolling.RollingFileAppender">
19         <!--日誌名,指定最新的檔名,其他檔名使用FileNamePattern -->
20         <File>${LOG_HOME}/tpi.log</File>
21         <!--檔案滾動模式-->
22         <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
23             <!--日誌檔案輸出的檔名,可設定檔案型別為gz,開啟檔案壓縮-->
24             <FileNamePattern>${LOG_HOME}/tpi.%d{yyyy-MM-dd}.%i.log.gz</FileNamePattern>
25             <!--日誌檔案保留天數-->
26             <MaxHistory>1</MaxHistory>
27             <!--按大小分割同一天的-->
28             <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
29                 <maxFileSize>1GB</maxFileSize>
30             </timeBasedFileNamingAndTriggeringPolicy>
31             <!--每次啟動刪除多餘日誌-->
32             <cleanHistoryOnStart>true</cleanHistoryOnStart>
33             <totalSizeCap>2GB</totalSizeCap>
34         </rollingPolicy>
35 
36         <filter class="ch.qos.logback.classic.filter.LevelFilter">
37             <level>ERROR</level>   <!--過濾掉error的級別-->
38             <onMatch>DENY</onMatch>
39             <onMismatch>ACCEPT</onMismatch>
40         </filter>
41 
42         <!--輸出格式-->
43         <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
44             <!--格式化輸出:%d表示日期,%thread表示執行緒名,%-5level:級別從左顯示5個字元寬度%msg:日誌訊息,%n是換行符-->
45             <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
46             <!--設定編碼-->
47             <charset>UTF-8</charset>
48         </encoder>
49 
50     </appender>
51 
52     <appender name="FILE_ERROR"  class="ch.qos.logback.core.rolling.RollingFileAppender">
53         <file>${LOG_HOME}/error.log</file>
54         <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
55             <fileNamePattern>${LOG_HOME}/error.%d{yyyy-MM-dd}.%i.log</fileNamePattern>
56             <MaxHistory>1</MaxHistory>
57             <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
58                 <maxFileSize>500MB</maxFileSize>
59             </timeBasedFileNamingAndTriggeringPolicy>
60             <cleanHistoryOnStart>true</cleanHistoryOnStart>
61             <totalSizeCap>2GB</totalSizeCap>
62         </rollingPolicy>
63         <!-- 過濾日誌 -->
64         <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
65             <level>ERROR</level>
66         </filter>
67         <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
68             <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50}[%L] - %msg%n</pattern>
69             <charset>UTF-8</charset>
70         </encoder>
71     </appender>
72 
73     <!--指定基礎的日誌輸出級別-->
74     <root level="INFO">
75         <!--appender將會新增到這個loger-->
76         <appender-ref ref="console"/>
77         <appender-ref ref="timeFileOutput"/>
78         <appender-ref ref="FILE_ERROR" />
79     </root>
80 </configuration>
View Code