logback配置說明

配置說明


<!--
    scan 是否定期掃描xml文件, scanPeriod是說掃描週期是30秒
    scan:
    當此屬性設置爲true時,配置文件如果發生改變,將會被重新加載,默認值爲true。
    scanPeriod:
    設置監測配置文件是否有修改的時間間隔,如果沒有給出時間單位,默認單位是毫秒。當scan爲true時,此屬性生效。默認的時間間隔爲1分鐘。
    debug:
    當此屬性設置爲true時,將打印出logback內部日誌信息,實時查看logback運行狀態。默認值爲false。
-->
<configuration scan="true" scanPeriod="30 seconds" debug="false" packagingData="true">
    <!-- 項目名稱 -->
    <contextName>myApp1 contextName</contextName>
    <!-- 屬性 -->
    <property name="USER_HOME" value="./log"/>

    <!-- 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" timeReference="contextBirth"/>
    
    <!-- appender很重要,一個配置文件會有多個appender -->
    <!-- ConsoleApperder意思是從console中打印出來 -->
    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
        <!-- 過濾器,一個appender可以有多個 -->
        <!-- 閾值過濾,就是log行爲級別過濾,debug及debug以上的信息會被打印出來 -->
        <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
            <level>debug</level>
        </filter>

        <!-- encoders are assigned the type
             ch.qos.logback.classic.encoder.PatternLayoutEncoder by default -->
        <!-- encoder編碼規則 -->
        <encoder>
            <!--<pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>-->
            <!--<pattern>%d %contextName %msg%n</pattern>-->
            <!-- pattern模式 %d時間 %thread 線程名 %level行爲級別 %logger logger名稱 %method 方法名稱 %message 調用方法的入參消息 -->
            <pattern>%-4d [%thread] %highlight%-5level %cyan%logger.%-10method - %message%n</pattern>
        </encoder>
    </appender>
    
    <!-- FileAppender 輸出到文件 -->
    <appender name="FILE" class="ch.qos.logback.core.FileAppender">
        <!-- 文件存放位置 %{xxx} 就是之前定義的屬性xxx -->
        <file>${USER_HOME}/myApp1log-${bySecond}.log</file>
        
        <encoder>
            <!-- %date和%d是一個意思 %file是所在文件 %line是所在行 -->
            <pattern>%date %level [%thread] %logger{30} [%file:%line] %msg%n</pattern>
        </encoder>
    </appender>
    
    <!-- 輸出到HTML格式的文件 -->
    <appender name="HTMLFILE" class="ch.qos.logback.core.FileAppender">
        <!-- 過濾器,這個過濾器是行爲過濾器,直接過濾掉了除debug外所有的行爲信息 -->
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <level>debug</level>
            <onMatch>ACCEPT</onMatch>
            <onMismatch>DENY</onMismatch>
        </filter>

        <encoder class="ch.qos.logback.core.encoder.LayoutWrappingEncoder">
            <!-- HTML輸出格式 可以和上邊差不多 -->
            <layout class="ch.qos.logback.classic.html.HTMLLayout">
                <pattern>%relative%thread%mdc%level%logger%msg</pattern>
            </layout>
        </encoder>
        <file>${USER_HOME}/test.html</file>
    </appender>

    <!-- 滾動日誌文件,這個比較常用 -->
    <appender name="ROLLINGFILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <!-- 當project等於true的時候file就不會起效果-->
        <prudent>true</prudent>
        <!--<file>${USER_HOME}/logFile.log</file>-->
        <!-- 按天新建log日誌 -->
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <!-- daily rollover -->
            <fileNamePattern>${USER_HOME}/logFile.%d{yyyy-MM-dd}_%i.log</fileNamePattern>
            <!-- 保留30天的歷史日誌 -->
            <maxHistory>30</maxHistory>
            
            <!-- 基於大小和時間,這個可以有,可以沒有 -->
            <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
                <!-- or whenever the file size reaches 100MB -->
                <!-- 當一個日誌大小大於10KB,則換一個新的日誌。日誌名的%i從0開始,自動遞增 -->
                <maxFileSize>10KB</maxFileSize>
            </timeBasedFileNamingAndTriggeringPolicy>
        </rollingPolicy>

        <encoder>
            <!-- %ex就是指拋出的異常,full是顯示全部,如果在{}中寫入數字,則表示展示多少行 -->
            <pattern>%-4date [%thread] %-5level %logger{35} - %msg%n%ex{full, DISPLAY_EX_EVAL}</pattern>
        </encoder>
    </appender>

    <!-- 重點來了,上邊都是appender輸出源。這裏開始就是looger了 -->
    <!-- name意思是這個logger管的哪一片,像下面這個管的就是log/test包下的所有文件 level是隻展示什麼行爲信息級別以上的,類似閾值過濾器 additivity表示是否再拋出事件,就是說如果有一個logger的name是log,如果這個屬性是true,另一個logger就會在這個logger處理完後接着繼續處理 -->
    <logger name="log.test" level="INFO" additivity="false">
        <!-- 連接輸出源,也就是上邊那幾個輸出源 ,你可以隨便選幾個appender-->
        <appender-ref ref="STDOUT"/>
        <appender-ref ref="ROLLINGFILE"/>
        <appender-ref ref="HTMLFILE"/>
    </logger>
    <!-- 這個logger詳細到了類 -->
    <logger name="log.test.Foo" level="debug" additivity="false">
        <appender-ref ref="STDOUT"/>
        <appender-ref ref="ROLLINGFILE"/>
        <appender-ref ref="HTMLFILE"/>
    </logger>

    <!-- Strictly speaking, the level attribute is not necessary since -->
    <!-- the level of the root level is set to DEBUG by default.       -->
    <!-- 這就是上邊logger沒有管到的情況下 root默認接管所有logger -->
    <root level="debug">
        <appender-ref ref="STDOUT"/>
    </root>
</configuration>

場景說明


第1種:只配置root

Xml代碼  

  1. <configuration>   

  2.    

  3.   <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">   

  4.     <!-- encoder 默認配置爲PatternLayoutEncoder -->   

  5.     <encoder>   

  6.       <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>   

  7.     </encoder>   

  8.   </appender>   

  9.    

  10.   <root level="INFO">             

  11.     <appender-ref ref="STDOUT" />   

  12.   </root>     

  13.      

  14.  </configuration>  

  其中appender的配置表示打印到控制檯(稍後詳細講解appender );

<root level="INFO">將root的打印級別設置爲“INFO”,指定了名字爲“STDOUT”的appender。


當執行logback.LogbackDemo類的main方法時,root將級別爲“INFO”及大於“INFO”的日誌信息交給已經配置好的名爲“STDOUT”的appender處理,“STDOUT”appender將信息打印到控制檯;

打印結果如下:

 

Xml代碼  

  1. 13:30:38.484 [main] INFO  logback.LogbackDemo - ======info  

  2. 13:30:38.500 [main] WARN  logback.LogbackDemo - ======warn  

  3. 13:30:38.500 [main] ERROR logback.LogbackDemo - ======error 


第2種:帶有loger的配置,不指定級別,不指定appender

 

Xml代碼  

  1. <configuration>   

  2.    

  3.   <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">   

  4.     <!-- encoder 默認配置爲PatternLayoutEncoder -->   

  5.     <encoder>   

  6.       <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>   

  7.     </encoder>   

  8.   </appender>   

  9.    

  10.   <!-- logback爲java中的包 -->   

  11.   <logger name="logback"/>   

  12.    

  13.   <root level="DEBUG">             

  14.     <appender-ref ref="STDOUT" />   

  15.   </root>     

  16.      

  17.  </configuration>  

 

 其中appender的配置表示打印到控制檯(稍後詳細講解appender );

<logger name="logback" />將控制logback包下的所有類的日誌的打印,但是並沒用設置打印級別,所以繼承他的上級<root>的日誌級別“DEBUG”;

沒有設置addtivity,默認爲true,將此loger的打印信息向上級傳遞;

沒有設置appender,此loger本身不打印任何信息。

<root level="DEBUG">將root的打印級別設置爲“DEBUG”,指定了名字爲“STDOUT”的appender。

 

當執行logback.LogbackDemo類的main方法時,因爲LogbackDemo 在包logback中,所以首先執行<logger name="logback" />,將級別爲“DEBUG”及大於“DEBUG”的日誌信息傳遞給root,本身並不打印;

root接到下級傳遞的信息,交給已經配置好的名爲“STDOUT”的appender處理,“STDOUT”appender將信息打印到控制檯;

打印結果如下:

 

Xml代碼  

  1. 13:19:15.406 [main] DEBUG logback.LogbackDemo - ======debug  

  2. 13:19:15.406 [main] INFO  logback.LogbackDemo - ======info  

  3. 13:19:15.406 [main] WARN  logback.LogbackDemo - ======warn  

  4. 13:19:15.406 [main] ERROR logback.LogbackDemo - ======error  

 

 

 第3種:帶有多個loger的配置,指定級別,指定appender  

 

Xml代碼  

  1. <configuration>   

  2.    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">   

  3.     <!-- encoder 默認配置爲PatternLayoutEncoder -->   

  4.     <encoder>   

  5.       <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>   

  6.     </encoder>   

  7.   </appender>   

  8.    

  9.   <!-- logback爲java中的包 -->   

  10.   <logger name="logback"/>   

  11.   <!--logback.LogbackDemo:類的全路徑 -->   

  12.   <logger name="logback.LogbackDemo" level="INFO" additivity="false">  

  13.     <appender-ref ref="STDOUT"/>  

  14.   </logger>   

  15.     

  16.   <root level="ERROR">             

  17.     <appender-ref ref="STDOUT" />   

  18.   </root>     

  19. </configuration>  

 

其中appender的配置表示打印到控制檯(稍後詳細講解appender );

 

<logger name="logback" />將控制logback包下的所有類的日誌的打印,但是並沒用設置打印級別,所以繼承他的上級<root>的日誌級別“DEBUG”;

沒有設置addtivity,默認爲true,將此loger的打印信息向上級傳遞;

沒有設置appender,此loger本身不打印任何信息。

 

 <logger name="logback.LogbackDemo" level="INFO" additivity="false">控制logback.LogbackDemo類的日誌打印,打印級別爲“INFO”;

additivity屬性爲false,表示此loger的打印信息不再向上級傳遞,

指定了名字爲“STDOUT”的appender。

 

<root level="DEBUG">將root的打印級別設置爲“ERROR”,指定了名字爲“STDOUT”的appender。

 

 當執行logback.LogbackDemo類的main方法時,先執行<logger name="logback.LogbackDemo" level="INFO" additivity="false">,將級別爲“INFO”及大於“INFO”的日誌信息交給此loger指定的名爲“STDOUT”的 appender處理,在控制檯中打出日誌,不再向次loger的上級 <logger name="logback"/> 傳遞打印信息;

<logger name="logback"/>未接到任何打印信息,當然也不會給它的上級root傳遞任何打印信息;

打印結果如下:  

 

Xml代碼  

  1. 14:05:35.937 [main] INFO  logback.LogbackDemo - ======info  

  2. 14:05:35.937 [main] WARN  logback.LogbackDemo - ======warn  

  3. 14:05:35.937 [main] ERROR logback.LogbackDemo - ======error  

 

 如果將<logger name="logback.LogbackDemo" level="INFO" additivity="false">修改爲 <logger name="logback.LogbackDemo" level="INFO" additivity="true">那打印結果將是什麼呢?

沒錯,日誌打印了兩次,想必大家都知道原因了,因爲打印信息向上級傳遞,logger本身打印一次,root接到後又打印一次

打印結果如下:  

 

Xml代碼  

  1. 14:09:01.531 [main] INFO  logback.LogbackDemo - ======info  

  2. 14:09:01.531 [main] INFO  logback.LogbackDemo - ======info  

  3. 14:09:01.531 [main] WARN  logback.LogbackDemo - ======warn  

  4. 14:09:01.531 [main] WARN  logback.LogbackDemo - ======warn  

  5. 14:09:01.531 [main] ERROR logback.LogbackDemo - ======error  

  6. 14:09:01.531 [main] ERROR logback.LogbackDemo - ======error  

說明

logger會繼承父logger的appender,此時level還是當前logger的級別,不會受父logger中level級別的影響。當additivity爲false時中斷集成關係。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章