logback和slf4j的使用之logger使用

原文:https://blog.csdn.net/cw_hello1/article/details/51923814html

 

1、logger標籤描述:(瞭解logger標籤以前先看看兩個重要概念)
 
  
	1.主要概念:★★級別繼承(level inheritance)
		1)root標籤是全部logger的祖先元素,全部的logger都繼承與root元素,至關於java中的object對象。
		2)每個logger標籤均可以指定一個級別(TRACE,DEBUG,INFO,WARN,ERROR五種,他們是在class中定義的)。ch.qos.logback.classic.Level
		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屬性值。
 
  
2、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對象。
相關文章
相關標籤/搜索