1. 程式人生 > >l配置log4j完成日誌輸出與配置檔案log4j2.xml詳解

l配置log4j完成日誌輸出與配置檔案log4j2.xml詳解

一、配置檔案節點解析

  
(1)根節點Configuration有兩個屬性:status和monitorinterval,有兩個子節點:Appenders和Loggers(表明可以定義多個Appender和Logger).
status用來指定log4j本身的列印日誌的級別.
monitorinterval用於指定log4j自動重新配置的監測間隔時間,單位是s,最小是5s.
(2)Appenders節點,常見的有三種子節點:Console、RollingFile、File.
Console節點用來定義輸出到控制檯的Appender.
name:指定Appender的名字.
target:SYSTEM_OUT 或 SYSTEM_ERR,一般只設置預設:SYSTEM_OUT.
PatternLayout:輸出格式,不設定預設為:%m%n.

File節點用來定義輸出到指定位置的檔案的Appender.
name:指定Appender的名字.
fileName:指定輸出日誌的目的檔案帶全路徑的檔名.
PatternLayout:輸出格式,不設定預設為:%m%n.

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.
Root節點用來指定專案的根日誌,如果沒有單獨指定Logger,那麼就會預設使用該Root日誌輸出
level:日誌輸出級別,共有8個級別,按照從低到高為:All < Trace < Debug < Info < Warn < Error < Fatal < OFF.
AppenderRef:Root的子節點,用來指定該日誌輸出到哪個Appender.

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:最高等級的,用於關閉所有日誌記錄.
程式會列印高於或等於所設定級別的日誌,設定的日誌等級越高,打印出來的日誌就越少。

二.比較完整的log4j2.xml配置模板

<?xml version="1.0" encoding="UTF-8"?>

<!--日誌級別以及優先順序排序: OFF > FATAL > ERROR > WARN > INFO > DEBUG > TRACE > ALL -->

<!--Configuration後面的status,這個用於設定log4j2自身內部的資訊輸出,可以不設定,當設定成trace時,你會看到log4j2內部各種詳細輸出-->

<!--monitorInterval:Log4j能夠自動檢測修改配置 檔案和重新配置本身,設定間隔秒數-->

<configuration status="WARN" monitorInterval="30">

     <!--先定義所有的appender-->

     <appenders>

         <!--這個輸出控制檯的配置-->

         <console name="Console" target="SYSTEM_OUT">

         <!--輸出日誌的格式-->

             <PatternLayout pattern="[%d{HH:mm:ss:SSS}] [%p] - %l - %m%n"/>

         </console>

         <!--檔案會打印出所有資訊,這個log每次執行程式會自動清空,由append屬性決定,這個也挺有用的,適合臨時測試用-->

         <File name="log" fileName="log/test.log" append="false">

             <PatternLayout pattern="%d{HH:mm:ss.SSS} %-5level %class{36} %L %M - %msg%xEx%n"/>

         </File>

         <!-- 這個會打印出所有的info及以下級別的資訊,每次大小超過size,則這size大小的日誌會自動存入按年份-月份建立的資料夾下面並進行壓縮,作為存檔-->

         <RollingFile name="RollingFileInfo" fileName="${sys:user.home}/logs/info.log"

                      filePattern="${sys:user.home}/logs/$${date:yyyy-MM}/info-%d{yyyy-MM-dd}-%i.log">

             <!--控制檯只輸出level及以上級別的資訊(onMatch),其他的直接拒絕(onMismatch)-->       

             <ThresholdFilter level="info" onMatch="ACCEPT" onMismatch="DENY"/>

             <PatternLayout pattern="[%d{HH:mm:ss:SSS}] [%p] - %l - %m%n"/>

             <Policies>

                 <TimeBasedTriggeringPolicy/>

                 <SizeBasedTriggeringPolicy size="100 MB"/>

             </Policies>

         </RollingFile>

         <RollingFile name="RollingFileWarn" fileName="${sys:user.home}/logs/warn.log"

                      filePattern="${sys:user.home}/logs/$${date:yyyy-MM}/warn-%d{yyyy-MM-dd}-%i.log">

             <ThresholdFilter level="warn" onMatch="ACCEPT" onMismatch="DENY"/>

             <PatternLayout pattern="[%d{HH:mm:ss:SSS}] [%p] - %l - %m%n"/>

             <Policies>

                 <TimeBasedTriggeringPolicy/>

                 <SizeBasedTriggeringPolicy size="100 MB"/>

             </Policies>

             <!-- DefaultRolloverStrategy屬性如不設定,則預設為最多同一資料夾下7個檔案,這裡設定了20 -->

             <DefaultRolloverStrategy max="20"/>

         </RollingFile>

         <RollingFile name="RollingFileError" fileName="${sys:user.home}/logs/error.log"

                      filePattern="${sys:user.home}/logs/$${date:yyyy-MM}/error-%d{yyyy-MM-dd}-%i.log">

             <ThresholdFilter level="error" onMatch="ACCEPT" onMismatch="DENY"/>

             <PatternLayout pattern="[%d{HH:mm:ss:SSS}] [%p] - %l - %m%n"/>

             <Policies>

                 <TimeBasedTriggeringPolicy/>

                 <SizeBasedTriggeringPolicy size="100 MB"/>

             </Policies>

         </RollingFile>

     </appenders>

     <!--然後定義logger,只有定義了logger並引入的appender,appender才會生效-->

     <loggers>

         <!--過濾掉spring和mybatis的一些無用的DEBUG資訊-->

         <logger name="org.springframework" level="INFO"></logger>

         <logger name="org.mybatis" level="INFO"></logger>

         <root level="all">

             <appender-ref ref="Console"/>

             <appender-ref ref="RollingFileInfo"/>

             <appender-ref ref="RollingFileWarn"/>

             <appender-ref ref="RollingFileError"/>

         </root>

     </loggers>

 </configuration>

三、專案配置

1、配置web.xml

<servlet>
    <servlet-name>BaseServlet</servlet-name>
    <servlet-class>yzx.sv.lt.BaseServelt.BaseServlet</servlet-class>
    <init-param>
        <param-name>log4j-xml-path</param-name>
        <param-value>/WEB-INF/classes/conf/log4j/log4j.xml</param-value>
    </init-param>
    <load-on-startup>2</load-on-startup>
</servlet>

2、完成servlet init()讀取配置

package yzx.sv.lt.BaseServelt;

import org.apache.log4j.xml.DOMConfigurator;
import org.springframework.web.context.support.WebApplicationContextUtils;

import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;

public class BaseServlet extends HttpServlet {

    public void init() throws ServletException {
        super.init();
                //完成log4j配置
        String prefix = getServletContext().getRealPath("/");
        String xml = getInitParameter("log4j-xml-path");
        if (xml != null) {
            DOMConfigurator.configure(prefix + xml);
        }


    }

}

3、配置log4j.xml

<?xml version="1.0" encoding="UTF-8" ?>    
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">
<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/">
   <!-- ========================== 自定義輸出格式說明================================ -->
   <!-- %p 輸出優先順序,即DEBUG,INFO,WARN,ERROR,FATAL -->
   <!-- #%r 輸出自應用啟動到輸出該log資訊耗費的毫秒數  -->
   <!-- #%c 輸出所屬的類目,通常就是所在類的全名 -->
   <!-- #%t 輸出產生該日誌事件的執行緒名 -->
   <!-- #%n 輸出一個回車換行符,Windows平臺為“\r\n”,Unix平臺為“\n” -->
   <!-- #%d 輸出日誌時間點的日期或時間,預設格式為ISO8601,也可以在其後指定格式,比如:%d{yyy MMM dd HH:mm:ss,SSS},輸出類似:2002年10月18日 22:10:28,921  -->
   <!-- #%l 輸出日誌事件的發生位置,包括類目名、發生的執行緒,以及在程式碼中的行數。舉例:Testlog4.main(TestLog4.java:10)  -->
   <!-- ========================================================================== -->

   <!-- ========================== 輸出方式說明================================ -->
   <!-- Log4j提供的appender有以下幾種:  -->  
   <!-- org.apache.log4j.ConsoleAppender(控制檯),  -->
   <!-- org.apache.log4j.FileAppender(檔案),  -->
   <!-- org.apache.log4j.DailyRollingFileAppender(每天產生一個日誌檔案), -->
   <!-- org.apache.log4j.RollingFileAppender(檔案大小到達指定尺寸的時候產生一個新的檔案),  -->
   <!-- org.apache.log4j.WriterAppender(將日誌資訊以流格式傳送到任意指定的地方)   -->
   <!-- ========================================================================== -->
   <!-- 輸出日誌到控制檯 ConsoleAppender -->
   <appender name="console" class="org.apache.log4j.ConsoleAppender">
      <param name="Threshold" value="DEBUG"></param>
      <layout class="org.apache.log4j.TTCCLayout">
         <param name="ConversionPattern" value="%-d{yyyy-MM-dd HH:mm:ss} [%t:%r] - [%p] %l %m%n" />
      </layout>
   </appender>

   <!-- info級別日誌滾動檔案,檔案大小到達指定尺寸的時候產生一個新的檔案 -->
   <appender name="debugRollingFile" class="org.apache.log4j.RollingFileAppender">
      <!-- 設定File引數:日誌輸出檔名 -->
      <param name="File" value="/LOG4J/logs/debug.log"></param>
      <!-- 輸出到日誌檔案的日誌門檻(級別) -->
      <param name="Threshold" value="debug"></param>
      <!-- 設定是否在重新啟動服務時,在原有日誌的基礎新增新日誌 -->
      <param name="Append" value="true"></param>
      <!-- 設定檔案大小 -->
      <param name="MaxFileSize" value="1MB"></param>
      <!-- 設定檔案備份個數 -->
      <param name="MaxBackupIndex" value="10"></param>
      <!-- 設定輸出檔案專案和格式 -->
      <layout class="org.apache.log4j.PatternLayout">
         <param name="ConversionPattern" value="%-d{yyyy-MM-dd HH:mm:ss} [%t:%r] - [%p] %l %m%n" />
      </layout>
   </appender>

   <!-- info級別日誌滾動檔案,檔案大小到達指定尺寸的時候產生一個新的檔案 -->
   <appender name="infoRollingFile" class="org.apache.log4j.RollingFileAppender">
      <!-- 設定File引數:日誌輸出檔名 -->
      <param name="File" value="/LOG4J/logs/info.log"></param>
      <!-- 輸出到日誌檔案的日誌門檻(級別) -->
      <param name="Threshold" value="INFO"></param>
      <!-- 設定是否在重新啟動服務時,在原有日誌的基礎新增新日誌 -->
      <param name="Append" value="true"></param>
      <!-- 設定檔案大小 -->
      <param name="MaxFileSize" value="1MB"></param>
      <!-- 設定檔案備份個數 -->
      <param name="MaxBackupIndex" value="10"></param>
      <!-- 設定輸出檔案專案和格式 -->
      <layout class="org.apache.log4j.PatternLayout">
         <param name="ConversionPattern" value="%-d{yyyy-MM-dd HH:mm:ss} [%t:%r] - [%p] %l %m%n" />
      </layout>
   </appender>

   <!-- error級別日誌滾動檔案,檔案大小到達指定尺寸的時候產生一個新的檔案 -->
   <appender name="errorRollingFile" class="org.apache.log4j.RollingFileAppender">
      <!-- 設定File引數:日誌輸出檔名 -->
      <param name="File" value="/LOG4J/logs/error.log"></param>
      <!-- 輸出到日誌檔案的日誌門檻(級別) -->
      <param name="Threshold" value="ERROR"></param>
      <!-- 設定是否在重新啟動服務時,在原有日誌的基礎新增新日誌 -->
      <param name="Append" value="true"></param>
      <!-- 設定檔案大小 -->
      <param name="MaxFileSize" value="1MB"></param>
      <!-- 設定檔案備份個數 -->
      <param name="MaxBackupIndex" value="10"></param>
      <!-- 設定輸出檔案專案和格式 -->
      <layout class="org.apache.log4j.PatternLayout">
         <param name="ConversionPattern" value="%-d{yyyy-MM-dd HH:mm:ss} [%t:%r] - [%p] %l %m%n" />
      </layout>
   </appender>

   <!-- 定義全域性的日誌輸出級別,但是在輸出目的地的配置中配置的具體輸出級別優先順序高於全域性定義的優先順序。-->
   <!-- 如果在rollingFile中定義<param name="Threshold" value="info" />,那麼將會把info以上級別的資訊輸出 -->
   <root>
      <priority value="DEBUG" />
      <appender-ref ref="console" />
      <appender-ref ref="debugRollingFile" />
      <appender-ref ref="infoRollingFile" />
      <appender-ref ref="errorRollingFile" />
   </root>

</log4j:configuration>