配置說明
<!--
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代碼
<configuration>
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<!-- encoder 默認配置爲PatternLayoutEncoder -->
<encoder>
<pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
</encoder>
</appender>
<root level="INFO">
<appender-ref ref="STDOUT" />
</root>
</configuration>
其中appender的配置表示打印到控制檯(稍後詳細講解appender );
<root level="INFO">將root的打印級別設置爲“INFO”,指定了名字爲“STDOUT”的appender。
當執行logback.LogbackDemo類的main方法時,root將級別爲“INFO”及大於“INFO”的日誌信息交給已經配置好的名爲“STDOUT”的appender處理,“STDOUT”appender將信息打印到控制檯;
打印結果如下:
Xml代碼
13:30:38.484 [main] INFO logback.LogbackDemo - ======info
13:30:38.500 [main] WARN logback.LogbackDemo - ======warn
13:30:38.500 [main] ERROR logback.LogbackDemo - ======error
第2種:帶有loger的配置,不指定級別,不指定appender
Xml代碼
<configuration>
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<!-- encoder 默認配置爲PatternLayoutEncoder -->
<encoder>
<pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
</encoder>
</appender>
<!-- logback爲java中的包 -->
<logger name="logback"/>
<root level="DEBUG">
<appender-ref ref="STDOUT" />
</root>
</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代碼
13:19:15.406 [main] DEBUG logback.LogbackDemo - ======debug
13:19:15.406 [main] INFO logback.LogbackDemo - ======info
13:19:15.406 [main] WARN logback.LogbackDemo - ======warn
13:19:15.406 [main] ERROR logback.LogbackDemo - ======error
第3種:帶有多個loger的配置,指定級別,指定appender
Xml代碼
<configuration>
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<!-- encoder 默認配置爲PatternLayoutEncoder -->
<encoder>
<pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
</encoder>
</appender>
<!-- logback爲java中的包 -->
<logger name="logback"/>
<!--logback.LogbackDemo:類的全路徑 -->
<logger name="logback.LogbackDemo" level="INFO" additivity="false">
<appender-ref ref="STDOUT"/>
</logger>
<root level="ERROR">
<appender-ref ref="STDOUT" />
</root>
</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代碼
14:05:35.937 [main] INFO logback.LogbackDemo - ======info
14:05:35.937 [main] WARN logback.LogbackDemo - ======warn
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代碼
14:09:01.531 [main] INFO logback.LogbackDemo - ======info
14:09:01.531 [main] INFO logback.LogbackDemo - ======info
14:09:01.531 [main] WARN logback.LogbackDemo - ======warn
14:09:01.531 [main] WARN logback.LogbackDemo - ======warn
14:09:01.531 [main] ERROR logback.LogbackDemo - ======error
14:09:01.531 [main] ERROR logback.LogbackDemo - ======error
說明
logger會繼承父logger的appender,此時level還是當前logger的級別,不會受父logger中level級別的影響。當additivity爲false時中斷集成關係。