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

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM