一 :根節點 <configuration></configuration>
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> 子節點
<?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>
<?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>
<?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.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 節點
<?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>
<?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>
三 : <filter> 過濾節點
<?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>
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>
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>
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>
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>
