原文:https://blog.csdn.net/cw_hello1/article/details/51923814
一、logger標簽描述:(了解logger標簽之前先看看兩個重要概念)
1.主要概念:★★級別繼承(level inheritance)
1)root標簽是所有logger的祖先元素,所有的logger都繼承與root元素,相當於java中的object對象。
2)每一個logger標簽都可以指定一個級別(TRACE,DEBUG,INFO,WARN,ERROR五種,他們是在ch.qos.logback.classic.Level
class中定義的)。
3)如果一個指定的logger標簽沒有指定規則的話,就會繼承離他最近的祖先的級別。
4)因為所有的logger都是繼承root標簽,所以為了確保所有的logger都有一個級別,root標簽有一個默認的級別,默認值為DEBUG
5)看看下面四個例子:
2.重要概念:★★基本選擇規則(base selection rule):
1)任何一個logger對象都有五種級別,所以就對應有五種打印日志方法:logger.info(字符串),logger.debug(字符串)
2)如果使用logger.info(字符串)的話,那么logger打印級別就是INFO。
3)看看一個logger能不能打印出日志主要看兩個因素:①打印方法時使用的級別(logger.info()),②logger對象的有效級別。第一個
重要概念所講。
4)如何判斷是否打印出日志:規則如下:
A log request of level p issued to a logger having an effective level q, is enabled if p >= q.
一個logger打印級別為P,而他的有效級別為q。如果p>=q的話,p對應的信息能打印出來。否則就不能打印出對應的信息。
記住:有效級別是最低級別,高於有效級別的信息都能打印出來,低於有效級別都不能打印出來。
5)級別大小規則:TRACE<DEBUG<INFO<WARN<ERROR。
6)例如:
3.logger結構:
1)一個logger標簽包含:一個強制的name屬性,一個可選的level屬性和一個可選的additivity屬性(additivity的值有true和false)
2)level屬性的值:可以是TRACE,DEBUG,INFO,WARN,ERROR,OFF,ALL中任何一個,並且不區分大小寫。如果沒有寫
的話就會繼承離他最近的祖先的級別,就是第一個概念的內容。
3)其中name的值,很重要,並且是必須的。它主要是指定包名或者類名的全路徑(包含包名)。所有的logger對象都是通過這個來確定
祖先關系的。
4)logger標簽可以包含0個或者多個appender-ref標簽,所以每一個appender標簽都可以關聯到指定的logger中。
5)level默認是以覆蓋的方式繼承的。而appender-ref是附加的形式繼承的。
1)覆蓋方式:如果父親的級別是DEBUG,如果在這個logger中設置了INFO,最終這個logger的級別就是INFO
2)附加方式:如果在父親中有一個appender-ref(關聯一個appender標簽),在當前這個logger中也設置一個appender-ref,
那么當前的logger就有兩個appender-ref的關聯。如果想要改變默認的附加形式,那就要使用addtivity屬性值。
二、logger中appender附加方式:
1.在默認情況下:appender是累加的方式進行操作的。即:一個logger對象將會記錄:①與這個logger對象直接關聯的appender日志格式,
②是當前logger對象的祖先對象(所有祖先)的logger相關聯的appender日志格式。因此:同一個appender對象綁定到多個logger
對象上,就會造成日志輸出多份。
2.例如:
<configuration> <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender"> <encoder> <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern> </encoder> </appender> <logger name="chapters.configuration"> <appender-ref ref="STDOUT" /><!--STDOUT綁定到chapters.configuration上,這個logger的祖先是root--> </logger> <root level="debug"><!--在root上也綁定STDOUT的appender對象到root上。--> <appender-ref ref="STDOUT" /> </root> </configuration>
如果在charpters.configuration的類的日志打印的話,就會打印兩份。因為一份是charpters.configuration
的,一份是root的。所以就會打印兩次:如下所示:
14:25:36.343 [main] INFO chapters.configuration.MyApp3 - Entering application.
14:25:36.343 [main] INFO chapters.configuration.MyApp3 - Entering application.
14:25:36.359 [main] DEBUG chapters.configuration.Foo - Did it again!
14:25:36.359 [main] DEBUG chapters.configuration.Foo - Did it again!
14:25:36.359 [main] INFO chapters.configuration.MyApp3 - Exiting application.
14:25:36.359 [main] INFO chapters.configuration.MyApp3 - Exiting application.
這個名字為STDOUT附加到兩個logger對象上,root是任何logger對象的祖先。而chapters.configuration
又是MyApp3和Foo的祖先,所有打印兩次。
3.appender的累加功能不想想對新用戶造成困擾。而是對於日志記錄非常的靈活。
1)例如:如果你想要配置日志文件以便形成:①對於所有的logger對象的日志信息都打印到控制台上。
②並且只有一部分的logger對象打印到日志文件中。那就如下配置logback文件
<configuration> <appender name="FILE" class="ch.qos.logback.core.FileAppender"> <file>myApp.log</file> <encoder> <pattern>%date %level [%thread] %logger{10} [%file:%line] %msg%n</pattern> </encoder> </appender> <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender"> <encoder> <pattern>%msg%n</pattern> </encoder> </appender> <logger name="chapters.configuration"> <appender-ref ref="FILE" /> </logger> <root level="debug"> <appender-ref ref="STDOUT" /> </root> </configuration>
對於所有的日志對象都會打印日志信息到控制台上,但是對於chapters.configuration的日志對象還會記錄到
文件中。
4.覆蓋默認的appender的累加行為:
如果默認的累加行為不符合你的要求, 你可以通過設置【activity=false】來取消默認的行為(累加)。
1)例如:
<configuration> <appender name="FILE" class="ch.qos.logback.core.FileAppender"> <file>foo.log</file> <encoder> <pattern>%date %level [%thread] %logger{10} [%file : %line] %msg%n</pattern> </encoder> </appender> <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender"> <encoder> <pattern>%msg%n</pattern> </encoder> </appender> <logger name="chapters.configuration.Foo" additivity="false"> <appender-ref ref="FILE" /> </logger> <root level="debug"> <appender-ref ref="STDOUT" /> </root> </configuration>
上面那個例子中:一個名字叫FILE的appender附加到chapters.configuration.Foo的logger對象上,
並且這個logger對象的activity的屬性為false。這就意味着:Foo的日志信息將會按照名字叫FILE的
appender的樣式輸出,而不會附加任何一個祖先上的appender對象。但是,其他日志對象(不屬於
chapters.configuration.Foo及其子類的logger)仍然以附加的形式繼承appender對象。