logback節點配置詳解
一 :根節點 <configuration></configuration>
屬性 : debug : 預設為false ,設定為true時,將打印出logback內部日誌資訊,實時檢視logback執行狀態。 scan : 配置檔案如果發生改變,將會重新載入,預設值為true; scanPeriod : 檢測配置檔案是否有修改的時間間隔,如果沒有給出時間單位,預設單位時毫秒,當scan為true時,這個屬性生效,預設時間間隔為1min。1 <?xml version="1.0" encoding="utf-8"?> 2 1 <configurationdebug="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> 的子節點,是負責寫日誌的元件。<?xml version="1.0" encoding="utf-8"?> <configuration debug="true" scan="true" scanPeriod="2">1.1.1 :ConsoleAppender 把日誌新增到控制檯,有如下節點: <encoder> : 對日誌進行格式化。 <target> : 字串System.out 或者 System.err, 預設 System.out;<!-- 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>
<?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 :
<!-- 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 :
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