log4j2的簡單學習

log4j2的簡單學習:html

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.xmljava

<?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>
===============================================================================


1、Configurationweb

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

status : 用來指定log4j自己的打印日誌的級別.spring

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


2、Appenders節點json

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

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

        name:指定Appender的名字.mybatis

        target:SYSTEM_OUT 或 SYSTEM_ERR,通常只設置默認:SYSTEM_OUT.app

        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)


3、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中進行輸出。


4、關於日誌level

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

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

      Trace:是追蹤,就是程序推動如下,你就能夠寫個trace輸出,因此trace應該會特別多,不過不要緊,咱們能夠設置最低日誌級別不讓他輸出.

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

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

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

      Error:輸出錯誤信息日誌.

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

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

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

5、參考


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



6、遇到的一個問題

日誌忽然不打印了。查看日誌,發現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

相關文章
相關標籤/搜索