logback和slf4j的使用之logger使用


原文: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.Levelclass中定義的)。
		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對象。


免責聲明!

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



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