log4j2的簡單學習

log4j2的簡單學習:

package com.book.web.controller;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

//import org.apache.commons.logging.Log;
//import org.apache.commons.logging.LogFactory;
//import org.apache.logging.log4j.LogManager;
//import org.apache.logging.log4j.Logger;


/**
 * log4j2測試
 * @author liweihan
 *
 */
public class TestLog4j2Log {
	
	/**
	 	1.
		<dependency>
		  <groupId>org.apache.logging.log4j</groupId>
		  <artifactId>log4j-api</artifactId>
		  <version>2.5</version>
		</dependency>
		<dependency>
		  <groupId>org.apache.logging.log4j</groupId>
		  <artifactId>log4j-core</artifactId>
		  <version>2.5</version>
		</dependency>
		
		如果是web環境可以加入:因爲會提示:
		Log4j appears to be running in a Servlet environment,
		 but there's no log4j-web module available. 
		 If you want better web container support,
		 please add the log4j-web JAR to your web archive or server lib directory.
		<dependency>
		  <groupId>org.apache.logging.log4j</groupId>
		  <artifactId>log4j-web</artifactId>
		  <version>2.2</version>
		</dependency>
	 	
	 	2.
	 	log4j2與log4j1發生了很大的變化,不兼容。
	 	log4j1僅僅作爲一個實際的日誌框架,
	 	slf4j、commons-logging作爲門面,統一各種日誌框架的混亂格局,
	 	現在log4j2也想跳出來充當門面了,也想統一大家了!!
	 	
		3.log4j2分成2個部分:

			log4j-api: 作爲日誌接口層,用於統一底層日誌系統
			log4j-core : 作爲上述日誌接口的實現,是一個實際的日誌框架
			
		4.log4j 2.x版本不再支持像1.x中的.properties後綴的文件配置方式,
		  2.x版本配置文件後綴名只能爲”.xml”,”.json”或者”.jsn”。
		  
		  log4j2默認會在classpath目錄下尋找:
		  <1.>log4j2-test.json 或者log4j2-test.jsn的文件
		  <2.>log4j2-test.xml的文件.
		  <3.>log4j2.json 或者log4j2.jsn的文件.
		  <4.>log4j2.xml的文件.
		     
		      如果都沒有找到,則會按默認配置輸出,也就是輸出到控制檯
		
		5.和log4j1是不同的。此時Logger是log4j-api中定義的接口,而log4j1中的Logger則是類
		
		6.如果要log4j2與commons-logging集成,還需要引入jar包:
		<dependency>
		  <groupId>commons-logging</groupId>
		  <artifactId>commons-logging</artifactId>
		  <version>1.2</version>
		</dependency>	
		<dependency>
		  <groupId>org.apache.logging.log4j</groupId>
		  <artifactId>log4j-jcl</artifactId>
		  <version>2.2</version>
		</dependency>
		
			commons-logging
			log4j-api (log4j2的API包)
			log4j-core (log4j2的API實現包)
			log4j-jcl (log4j2與commons-logging的集成包)
			
		private static Log logger = LogFactory.getLog(TestLog4j2Log.class);
		使用commons-logging的Log接口和LogFactory來進行編寫,看不到log4j2的影子。
		但是這時候含有上述幾個jar包,log4j2就與commons-logging集成了起來。
		
		common-logging貌似不支持佔位符!
		
		7.如果log4j2與slf4j集成,還需要引入jar包:
		<!-- log4j2與slf4j集成 -->
		<dependency>
		  <groupId>org.slf4j</groupId>
		  <artifactId>slf4j-api</artifactId>
		  <version>1.7.7</version>
		</dependency>
		<dependency>
		  <groupId>org.apache.logging.log4j</groupId>
		  <artifactId>log4j-slf4j-impl</artifactId>
		  <version>2.5</version>
		</dependency>
		
		
		log4j-slf4j-impl : 用於log4j2與slf4j集成
		獲取logger的方式:
		private static Logger logger=LoggerFactory.getLogger(Log4j2Slf4jTest.class);
	 */
	
//	private static final Logger logger  = LogManager.getLogger(TestLog4j2Log.class);
//	private static Log logger = LogFactory.getLog(TestLog4j2Log.class);
	private static Logger logger = LoggerFactory.getLogger(TestLog4j2Log.class);
	
	public static void main(String[] args) {
		
		if (logger.isTraceEnabled()) {
			logger.trace(" ===== log4j2 trace meassge");
		}
		if (logger.isDebugEnabled()) {
			logger.debug(" ===== log4j2 debug message");
			logger.debug(" ------ test log4j2:{},{}","Hello ","HANCHo");
		}
		if (logger.isInfoEnabled()) {
			logger.info(" ===== log4j2 info message");
		}
		if (logger.isErrorEnabled()) {
			logger.error(" ===== log4j2 error message ");
		}
		
		//
		Object[] params = {"HAN",1,"CHAO"};
		logger.info(" ===== test:{}, 加班 {} 天, {}要回家了!",params);
	}

}


配置文件:log4j2.xml

<?xml version="1.0" encoding="UTF-8"?>  
<Configuration status="info" monitorInterval="300">  
	<Properties>
		<Property name="log.pattern">
		<!--%d %-5p [%t] %C{2} (%F:%L) - %m%n-->
		 %date{yyyy-MM-dd HH:mm:ss.SSS} %level [%thread][%file:%line] - %msg%n
		</Property>
	</Properties>

  <Appenders>  
  	
  	<!-- 控制檯 -->
    <Console name="Console" target="SYSTEM_OUT" >  
      <ThresholdFilter level="debug"/> 
       <PatternLayout pattern="${log.pattern}"/>
      <!-- 本地測試可以用這個 
      <PatternLayout pattern="%d %-5p [%t] %C{2} (%F:%L) - %m%n"/>
      --> 
      <!-- 
      <PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] [%-5level] %class{36} %L %M - %msg%n"/>  
       -->
      <!--
          %d{yyyy-MM-dd HH:mm:ss, SSS} : 日誌生產時間
          %p : 日誌輸出格式
          %c : logger的名稱
          %m : 日誌內容,即 logger.info("message")
          %n : 換行符
          %C : Java類名
          %L : 日誌輸出所在行數
          %M : 日誌輸出所在方法名
          hostName : 本地機器名
          hostAddress : 本地ip地址
       -->
    </Console>  
    
    <!-- 文件會打印出所有信息,這個log每次運行程序會自動清空,由append屬性決定,這個也挺有用的,適合臨時測試用  
    	append爲TRUE表示消息增加到指定文件中,false表示消息覆蓋指定的文件內容,默認值是true -->
    <File name="log" fileName="./logs/test.log" append="false">  
      <PatternLayout pattern="%d{HH:mm:ss.SSS} %-5level %class{36} %L %M - %msg%xEx%n"/>  
    </File>
    
    <!-- 打印所有的日誌到stdout.log文件 -->
    <RollingFile name="Stdout" fileName="./logs/stdout.log"  
                 filePattern="./logs/stdout.log.%d{yyyy-MM-dd}-%i">  
      <PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss.SSS} %-5level %logger{36} %L %M - %msg%xEx%n"/>  
      <Policies>
      <!-- 基於時間的滾動策略,interval屬性用來指定多久滾動一次,默認是1 hour。
      	    modulate=true用來調整時間:比如現在是早上3am,interval是4,
      	    那麼第一次滾動是在4am,接着是8am,12am...而不是7am. 
      -->
        <!-- 時間觸發,一天一個日誌 -->
        <TimeBasedTriggeringPolicy interval="24" modulate="true"/>
        <!-- 大小觸發,達到50M的時候進行分割 -->
        <SizeBasedTriggeringPolicy size="50 MB" />  
      </Policies>
      <!-- 用來指定同一個文件夾下最多有幾個日誌文件時開始刪除最舊的 -->
      <!-- DefaultRolloverStrategy屬性如不設置,
      	         則默認爲最多同一文件夾下7個文件,這裏設置了20 -->
      <DefaultRolloverStrategy max="30" />
    </RollingFile>
    
    <!-- 只打印error以及以上級別的日誌到stderr.log -->
    <RollingFile name="Error" fileName="./logs/stderr.log"  
                 filePattern="./logs/stderr.log.%d{yyyy-MM-dd}-%i">
      <!--  控制檯只輸出level及以上級別的信息(onMatch),其他的直接拒絕(onMismatch) -->
      <ThresholdFilter level="error" onMatch="ACCEPT" onMismatch="DENY"/>  
      <PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss.SSS} %-5level %logger{36} %L %M - %msg%xEx%n"/>  
      <Policies>
        <!-- 時間觸發,一天一個日誌 -->
        <TimeBasedTriggeringPolicy interval="24" modulate="true"/>
        <!-- 大小觸發,達到50M的時候進行分割 -->
        <SizeBasedTriggeringPolicy size="50 MB" />  
      </Policies>
      <!-- 用來指定同一個文件夾下最多有幾個日誌文件時開始刪除最舊的 -->
      <DefaultRolloverStrategy max="30" />  
    </RollingFile>
    
  </Appenders>  
  <Loggers> 
  	<!--過濾掉spring和mybatis的一些無用的DEBUG信息--> 
    <Logger name="org.mybatis" level="INFO"></Logger>
    <Logger name="org.springframework" level="INFO"></Logger>
    
    <Root level="debug">  
      <Appender-ref ref="Stdout"/>  
      <Appender-ref ref="Console"/>  
      <Appender-ref ref="Error"/>
      
      <!-- just for test temp -->
      <Appender-ref ref="log"/>
    </Root>  
  </Loggers>  
</Configuration>
===============================================================================


一、Configuration

有兩個屬性:status和monitorinterval,有兩個子節點:Appenders和Loggers(表明可以定義多個Appender和Logger).

status : 用來指定log4j本身的打印日誌的級別.

monitorinterval : 用於指定log4j自動重新配置的監測間隔時間,單位是s,最小是5s.


二、Appenders節點

常見的有三種子節點:Console、RollingFile、File.

1.Console:  Console節點用來定義輸出到控制檯的Appender.

        name:指定Appender的名字.

        target:SYSTEM_OUT 或 SYSTEM_ERR,一般只設置默認:SYSTEM_OUT.

        PatternLayout:輸出格式,不設置默認爲:%m%n.


2.File:   File節點用來定義輸出到指定位置的文件的Appender.

        name:指定Appender的名字.

        fileName:指定輸出日誌的目的文件帶全路徑的文件名.

        PatternLayout:輸出格式,不設置默認爲:%m%n.

3.RollingFile: RollingFile節點用來定義超過指定大小自動刪除舊的創建新的的Appender.

        name:指定Appender的名字.

        fileName:指定輸出日誌的目的文件帶全路徑的文件名.

        PatternLayout:輸出格式,不設置默認爲:%m%n.

        filePattern:指定新建日誌文件的名稱格式.

        Policies:指定滾動日誌的策略,就是什麼時候進行新建日誌文件輸出日誌.

                                          TimeBasedTriggeringPolicy:Policies子節點,基於時間的滾動策略,interval屬性用來指定多久滾動一次,默認是1 hour。modulate=true用來調整時間:比如現在是早上3am,interval是4,那麼第一次滾動是在4am,接着是8am,12am…而不是7am.

                           SizeBasedTriggeringPolicy:Policies子節點,基於指定文件大小的滾動策略,size屬性用來定義每個日誌文件的大小.

        DefaultRolloverStrategy:用來指定同一個文件夾下最多有幾個日誌文件時開始刪除最舊的,創建新的(通過max)


三、Loggers節點

常見子節點的有兩種:Root和Logger.

1.Root:

  Root節點用來指定項目的根日誌,如果沒有單獨指定Logger,那麼就會默認使用該Root日誌輸出   


      level:日誌輸出級別,共有8個級別,按照從低到高爲:All < Trace < Debug < Info < Warn < Error < Fatal < OFF.

     AppenderRef:Root的子節點,用來指定該日誌輸出到哪個Appender.


2.Logger:

               Logger節點用來單獨指定日誌的形式,比如要爲指定包下的class指定不同的日誌級別等。

     level:日誌輸出級別,共有8個級別,按照從低到高爲:All < Trace < Debug < Info < Warn < Error < Fatal < OFF.

     name:用來指定該Logger所適用的類或者類所在的包全路徑,繼承自Root節點.

     AppenderRef:Logger的子節點,用來指定該日誌輸出到哪個Appender,如果沒有指定,就會默認繼承自Root.如果指定了,那麼會在指定的這個Appender和Root的Appender中都會輸出,此時我們可以設置Logger的additivity=”false”只在自定義的Appender中進行輸出。


四、關於日誌level

              共有8個級別,按照從低到高爲:All < Trace < Debug < Info < Warn < Error < Fatal < OFF.

      All:最低等級的,用於打開所有日誌記錄.

      Trace:是追蹤,就是程序推進以下,你就可以寫個trace輸出,所以trace應該會特別多,不過沒關係,我們可以設置最低日誌級別不讓他輸出.

      Debug:指出細粒度信息事件對調試應用程序是非常有幫助的.

      Info:消息在粗粒度級別上突出強調應用程序的運行過程.

      Warn:輸出警告及warn以下級別的日誌.

      Error:輸出錯誤信息日誌.

      Fatal:輸出每個嚴重的錯誤事件將會導致應用程序的退出的日誌.

      OFF:最高等級的,用於關閉所有日誌記錄.

      程序會打印高於或等於所設置級別的日誌,設置的日誌等級越高,打印出來的日誌就越少

五、參考


log4j2:

http://blog.csdn.net/vergilgeekopen/article/details/61417342

http://www.cnblogs.com/hanfight/p/5721855.html


性能對比:

https://my.oschina.net/OutOfMemory/blog/789267

http://blog.csdn.net/yjh1271845364/article/details/70888262


其他日誌系統瞭解:

http://blog.csdn.net/xudan1010/article/details/52890102

http://www.cnblogs.com/Leo_wl/p/3417215.html

https://my.oschina.net/pingpangkuangmo/blog/406618



六、遇到的一個問題

日誌突然不打印了。查看日誌,發現log4j2本身的日誌顯示:在加載log4j2.xml文件時發生錯誤。

log4j2使用自己默認的log4j2的配置,只能打印error日誌。

wKiom1mWuiSxZ0DMAAFGsqRvD2Q404.jpg

默認配置:

<?xml version="1.0" encoding="UTF-8"?>
  <Configuration status="WARN">
    <Appenders>
      <Console name="Console" target="SYSTEM_OUT">
        <PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>
      </Console>
    </Appenders>
    <Loggers>
      <Root level="error">
       <AppenderRef ref="Console"/>
     </Root>
   </Loggers>
 </Configuration>

分析原因:

wKiom1maRxDSgCO0AACrYMNidzE170.jpg

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