1. 程式人生 > >log4j2.x配置檔案中各標籤詳解

log4j2.x配置檔案中各標籤詳解

log4j2.0以後我們通常在log4j2.xml中配置相關引數,在配置的時候我們需要理解這些引數的具體含義,下面列出了這些引數的解釋。

1、Logger 完成日誌資訊的處理

<logger name="com.srd.ljzd" level="INFO" additivity="true">
    <appender-ref ref="INFO" />
    <appender-ref ref="WARN" />
    <appender-ref ref="ERROR" />
    <appender-ref ref="Mail"
/> </logger>

logger中的name是指程式碼的包名或類名,路徑要寫全,可以配置不同包中的日誌輸出到不同的檔案中。level是日誌輸出級別,定義輸出的層次和決定資訊是否輸出,

DEBUG<INFO<WARN<ERROR

additivity設定事件是否在root logger輸出,為了避免重複輸出,可以在Logger 標籤下設定additivity為”false”。

2、Appender 設定在哪輸出日誌資訊
FileAppender   普通地輸出到本地檔案
FlumeAppender  將幾個不同源的日誌彙集、集中到一處。
JMSQueueAppender VS. JMSTopicAppender  與JMS相關的日誌輸出
RewriteAppender   對日誌事件進行掩碼或注入資訊
RollingFileAppender  對日誌檔案進行封存(詳細)
RoutingAppender  在輸出地之間進行篩選路由
SMTPAppender  將LogEvent傳送到指定郵件列表
SocketAppender  將LogEvent以普通格式傳送到遠端主機
SyslogAppender  將LogEvent以RFC 5424格式傳送到遠端主機
AsynchAppender   將一個LogEvent非同步地寫入多個不同輸出地
ConsoleAppender  將LogEvent輸出到命令列
FailoverAppender  維護一個佇列,系統將嘗試向佇列中的Appender依次輸出LogEvent,直到有一個成功為止

其中ConsoleAppender、RollingFileAppender和SMTPAppender較為常用。如果想詳細瞭解,可以參考log4j的官方文件

ConsoleAppender將輸出寫到System.err或System.out。如果想將輸出寫到System.out,設定Console標籤下的target為”SYSTEM_OUT”即可;如果想將輸出寫到System.err,設定Console標籤下的target為”SYSTEM_ERR “即可。

RollingFileAppender跟FileAppender的基本用法一樣。但RollingFileAppender可以設定log檔案的size(單位:KB/MB/GB)上限、數量上限,當log檔案超過設定的size上限,會自動被壓縮。RollingFileAppender可以理解為滾動輸出日誌,如果log4j 2記錄的日誌達到上限,舊的日誌將被刪除,騰出的空間用於記錄新的日誌,DefaultRolloverStrategy 標籤的max設定壓縮檔案的上限(預設值為7)。

SMTPAppender主要用來給指定的E-mail傳送log event。

<SMTP name="Mail" subject="****SaaS系統正式版異常資訊" to="yong.shi@lengjing.info" from="message@lengjing.info" smtpUsername="message@lengjing.info" smtpPassword="LENG****1234" smtpHost="mail.lengjing.info" smtpDebug="false" smtpPort="25" bufferSize="10">
    <PatternLayout pattern="[%-5p]:%d{YYYY-MM-dd HH:mm:ss} [%t] %c{1}:%L - %msg%n" />
        </SMTP>

SMTPAppender預設情況下只發送ERROR級別以上的日誌,在測試的時候會發現低級別的日誌是不會通過郵箱傳送的。

3、Layout 設定日誌資訊的輸出格式
layout有以下幾種:
org.apache.log4j.HTMLLayout(以HTML表格形式佈局)
org.apache.log4j.SimpleLayout(包含日誌訊息的級別和訊息字串)
org.apache.log4j.TTCCLayout(包含日誌產生的時間、執行緒、類別等訊息)
org.apache.log4j.PatterLayout(可以靈活地指定佈局格式)

詳細配置可以參考官方文件

4,Filters
Filter可以過濾log事件,並控制log輸出,詳細配置可以參考官方文件

例如ThresholdFilter 可以實現單個log級別的過濾功能。

5,Status

<Configuration status="OFF" monitorInterval="30">

log4j 2定義的status級別有8個:ALL,TRACE, DEBUG, INFO, WARN, ERROR ,FATAL,OFF。其實status屬性是幫助開發者找錯用的,它可以檢測log4j 2的配置檔案是否有錯,也可以檢測到死迴圈的logger。

6,monitorInterval

<Configuration status="OFF" monitorInterval="30">

通過設定monitorInterval屬性,即可設定log4j 2自動檢測配置檔案的時間間隔(單位:秒),最小間隔為5秒。log4j 2檢測到配置檔案有變化,會重新配置自己。

7,Policies 配置日誌相關策略
SizeBasedTriggeringPolicy 設定日誌大小達到一定大小後打包生成壓縮檔案。
TimeBasedTriggeringPolicy 基於時間的觸發策略。該策略主要是完成周期性的log檔案封存工作。有兩個引數:
interval,integer型,指定兩次封存動作之間的時間間隔。單位:以日誌的命名精度來確定單位,比如yyyy-MM-dd-HH 單位為小時,yyyy-MM-dd-HH-mm 單位為分鐘。
modulate,boolean型,說明是否對封存時間進行調製。若modulate=true,則封存時間將以0點為邊界進行偏移計算。比如,modulate=true,interval=4hours,那麼假設上次封存日誌的時間為03:00,則下次封存日誌的時間為04:00,之後的封存時間依次為08:00,12:00,16:00。

這裡將我在專案中常用配置貢獻給大家,可以滿足大部分需求。

<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="OFF" monitorInterval="30">
    <properties>
        <!--設定日誌在硬碟上輸出的目錄-->
        <property name="logPath">D:/ljzx_log</property>
    </properties>

    <Appenders>
        <!--設定在控制檯列印日誌-->
        <Console name="Console" target="SYSTEM_OUT">
            <PatternLayout pattern="[%-5p]:%d{YYYY-MM-dd HH:mm:ss} [%t] %c{1}:%L - %msg%n" />
        </Console>

        <!--設定級別為INFO日誌輸出到info.log中-->
        <RollingFile name="INFO" filename="${logPath}/info.log"
                     filepattern="${logPath}/%d{YYYYMMdd}-%i-info.log.zip">
            <Filters>
                <!--設定只輸出級別為INFO的日誌-->
                <ThresholdFilter level="INFO"/>
                <ThresholdFilter level="WARN" onMatch="DENY" onMismatch="NEUTRAL"/>
            </Filters>
            <PatternLayout pattern="[ %-5p]:%d{YYYY-MM-dd HH:mm:ss} [%t] %c{1}:%L - %msg%n" />
            <Policies>
                <!--設定每天打包日誌一次-->
                <TimeBasedTriggeringPolicy interval="1" modulate="true"/>
                <!--設定日誌檔案滿1MB後打包-->
                <SizeBasedTriggeringPolicy size="1 MB" />
            </Policies>
            <DefaultRolloverStrategy max="20" />
        </RollingFile>

        <!--設定級別為WARN日誌輸出到warn.log中-->
        <RollingFile name="WARN" filename="${logPath}/warn.log"
                     filepattern="${logPath}/%d{YYYYMMdd}-%i-warn.log.zip">
            <Filters>
                <!--設定只輸出級別為WARN的日誌-->
                <ThresholdFilter level="WARN"/>
                <ThresholdFilter level="ERROR" onMatch="DENY" onMismatch="NEUTRAL"/>
            </Filters>
            <PatternLayout pattern="[ %-5p]:%d{YYYY-MM-dd HH:mm:ss} [%t] %c{1}:%L - %msg%n" />
            <Policies>
                <!--設定每天打包日誌一次-->
                <TimeBasedTriggeringPolicy interval="1" modulate="true"/>
                <!--設定日誌檔案滿1MB後打包-->
                <SizeBasedTriggeringPolicy size="1 MB" />
            </Policies>
            <DefaultRolloverStrategy max="20" />
        </RollingFile>

        <!--設定級別為ERROR日誌輸出到error.log中-->
        <RollingFile name="ERROR" filename="${logPath}/error.log"
                     filepattern="${logPath}/%d{YYYYMMdd}-%i-error.log.zip">
            <!--設定只輸出級別為ERROR的日誌-->
            <ThresholdFilter level="ERROR"/>
            <PatternLayout pattern="[ %-5p]:%d{YYYY-MM-dd HH:mm:ss} [%t] %c{1}:%L - %msg%n" />
            <Policies>
                <!--設定每天打包日誌一次-->
                <TimeBasedTriggeringPolicy interval="1" modulate="true"/>
                <!--設定日誌檔案滿1MB後打包-->
                <SizeBasedTriggeringPolicy size="1 MB" />
            </Policies>
            <DefaultRolloverStrategy max="20" />
        </RollingFile>

        <!--設定通過郵件傳送日誌資訊-->
        <SMTP name="Mail" subject="XXXXSaaS系統正式版異常資訊" to="[email protected]nfo" from="[email protected]" 
              smtpUsername="[email protected]" smtpPassword="LENG****1234" smtpHost="mail.lengjing.info" smtpDebug="false" 
              smtpPort="25" bufferSize="10">
            <PatternLayout pattern="[%-5p]:%d{YYYY-MM-dd HH:mm:ss} [%t] %c{1}:%L - %msg%n" />
        </SMTP>
    </Appenders>

    <Loggers>
        <logger name="com.srd.ljzd" level="INFO" additivity="true">
            <appender-ref ref="INFO" />
            <appender-ref ref="WARN" />
            <appender-ref ref="ERROR" />
            <appender-ref ref="Mail" />
        </logger>
        <root level="DEBUG">
            <appender-ref ref="Console"/>
        </root>
    </Loggers>
</Configuration>