Maven項目配置log4j2.xml

log4j2相對於log4j 1.x有了脫胎換骨的變化,其官網宣稱的優勢有多線程下10幾倍於log4j 1.x和logback的高吞吐量、可配置的審計型日誌、基於插件架構的各種靈活配置等。

以下是log4j2在maven 項目中的配置步驟:

1、在pom.xml文件中引入log4j依賴

<!-- https://mvnrepository.com/artifact/org.apache.logging.log4j/log4j-core -->
<dependency>
    <groupId>org.apache.logging.log4j</groupId>
    <artifactId>log4j-core</artifactId>
    <version>2.10.0</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.apache.logging.log4j/log4j-api -->
<dependency>
    <groupId>org.apache.logging.log4j</groupId>
    <artifactId>log4j-api</artifactId>
    <version>2.10.0</version>
</dependency>

<!-- https://mvnrepository.com/artifact/org.apache.logging.log4j/log4j-web -->
<dependency>
    <groupId>org.apache.logging.log4j</groupId>
    <artifactId>log4j-web</artifactId>
    <version>2.10.0</version>
</dependency>
<!-- https://mvnrepository.com/artifact/com.lmax/disruptor -->
<dependency>
    <groupId>com.lmax</groupId>
    <artifactId>disruptor</artifactId>
    <version>3.4.1</version>
</dependency>

2、配置log4j2.xml文件放置到src/main/resources目錄下

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

<!--
    status : 這個用於設置log4j2自身內部的信息輸出,可以不設置,當設置成trace時,會看到log4j2內部各種詳細輸出
    monitorInterval : Log4j能夠自動檢測修改配置文件和重新配置本身, 設置間隔秒數。
-->
<Configuration status="WARN" monitorInterval="600">

    <Properties>
        <!-- 配置日誌文件輸出目錄 -->
        <Property name="LOG_HOME">${sys:catalina.home}/WebAppLogs/</Property>
    </Properties>

    <Appenders>

        <!--這個輸出控制檯的配置-->
        <Console name="Console" target="SYSTEM_OUT">
            <!-- 控制檯只輸出level及以上級別的信息(onMatch),其他的直接拒絕(onMismatch) -->
            <!-- <ThresholdFilter level="trace" onMatch="ACCEPT" onMismatch="DENY"/>-->
            <ThresholdFilter level="trace" onMatch="ACCEPT" onMismatch="ACCEPT"/>
            <!-- 輸出日誌的格式 -->
            <PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss.SSS} %-5level %class{36} %L %M - %msg%xEx%n"/>
        </Console>

        <!-- 設置日誌格式並配置日誌壓縮格式(service.log.年份.gz) -->
        <RollingRandomAccessFile name="service_appender"
                                 fileName="${LOG_HOME}/service.log"
                                 filePattern="${LOG_HOME}/service.log.%d{yyyy-MM-dd}.log.gz">
            <!--
                %d{yyyy-MM-dd HH:mm:ss, SSS} : 日誌生產時間
                %p : 日誌輸出格式
                %c : logger的名稱
                %m : 日誌內容,即 logger.info("message")
                %n : 換行符
                %C : Java類名
                %L : 日誌輸出所在行數
                %M : 日誌輸出所在方法名
                hostName : 本地機器名
                hostAddress : 本地ip地址
             -->
            <PatternLayout>
                <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} %-5level %class{36} %L %M -- %msg%xEx%n</pattern>
            </PatternLayout>
            <Policies>
              
              <TimeBasedTriggeringPolicy/>
         		<SizeBasedTriggeringPolicy size="100 MB"/>  
        		<!--  <TimeBasedTriggeringPolicy interval="1" modulate="true" /> -->
                
            </Policies>
        </RollingRandomAccessFile>


        <!-- DEBUG日誌格式 -->
        <RollingRandomAccessFile name="service_debug_appender"
                                 fileName="${LOG_HOME}/service.log"
                                 filePattern="${LOG_HOME}/service.log.%d{yyyy-MM-dd}.debug.gz">
            <PatternLayout>
                <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} %-5level %class{36} %L %M -- %msg%xEx%n</pattern>
            </PatternLayout>
            <Policies>
                <TimeBasedTriggeringPolicy interval="1" modulate="true" />
            </Policies>
        </RollingRandomAccessFile>
    </Appenders>

    <Loggers>
        <!-- 配置日誌的根節點 -->
        <root level="error">
            <appender-ref ref="Console"/>
             <appender-ref ref="service_appender"  level="error"/>
        </root>

        <!-- 第三方日誌系統 -->
        <logger name="org.springframework.core" level="info"/>
        <logger name="org.springframework.beans" level="info"/>
        <logger name="org.springframework.context" level="info"/>
        <logger name="org.springframework.web" level="info"/>
        <logger name="org.jboss.netty" level="warn"/>
        <logger name="org.apache.http" level="warn"/>

        <!-- 日誌實例(info),其中'service-log'繼承root,但是root將日誌輸出控制檯,而'service-log'將日誌輸出到文件,通過屬性'additivity="false"'將'service-log'的
             的日誌不再輸出到控制檯 -->
        <logger name="service_info_log" level="info" includeLocation="true" additivity="true">
            <appender-ref ref="service_appender"/>
        </logger>

        <!-- 日誌實例(debug) -->
        <logger name="service_debug_log" level="debug" includeLocation="true" additivity="true">
            <appender-ref ref="service_debug_appender"/>
        </logger>

    </Loggers>

</Configuration>

       上面的log4j2.xml中以Configuration爲根節點,有一個status屬性,這個屬性表示log4j2本身的日誌信息打印級別。如果把status改爲TRACE再執行測試代碼,可以看到控制檯中打印了一些log4j加載插件、組裝logger等調試信息。

  日誌級別從低到高分爲TRACE < DEBUG < INFO < WARN < ERROR < FATAL,如果設置爲WARN,則低於WARN的信息都不會輸出。對於Loggers中level的定義同樣適用。

  上面配置了兩種日誌打印的方式,打印的等級是error。

  • Console:在命令行打印
  • RollingRandomAccessFile:打印到文件中

  Rolling的意思是當滿足一定條件後,就重命名原日誌文件用於備份,並從新生成一個新的日誌文件。例如需求是每天生成一個日誌文件,但是如果一天內的日誌文件體積已經超過1G,就從新生成,兩個條件滿足一個即可。這在log4j 1.x原生功能中無法實現,在log4j2中就很簡單了。

RollingRandomAccessFile的屬性:

  • fileName  指定當前日誌文件的位置和文件名稱
  • filePattern  指定當發生Rolling時,文件的轉移和重命名規則
  • SizeBasedTriggeringPolicy  指定當文件體積大於size指定的值時,觸發Rolling
  • DefaultRolloverStrategy  指定最多保存的文件個數

  TimeBasedTriggeringPolicy  這個配置需要和filePattern結合使用,注意filePattern中配置的文件重命名規則是${log_path}/zcrTest%d{yyyy-MM-dd}.log,最小的時間粒度是dd,即分鐘,TimeBasedTriggeringPolicy指定的size是1,結合起來就是每一天生成一個新文件。如果改成%d{yyyy-MM-dd HH},最小粒度爲小時,則每一個小時生成一個文件。

3、配置xml文件的掃描路徑

<resources>
    <resource>
        <directory>src/main/java</directory>
        <includes>
            <include>**/*.properties</include>
            <include>**/*.xml</include>
        </includes>
        <filtering>true</filtering>
    </resource>
    <!--掃描配置文件所在的目錄-->            
    <resource>
        <directory>src/main/resources</directory>
        <includes>
            <include>**/*.properties</include>
            <include>**/*.xml</include>
        </includes>
        <filtering>false</filtering>
   </resource>      
</resources>

4、在web.xml文件中listener

<context-param>
    <param-name>log4jConfiguration</param-name>
    <param-value>{log4j2.xml所在目錄}/log4j2.xml</param-value>
</context-param>

<listener>
    <listener-class>org.apache.logging.log4j.web.Log4jServletContextListener</listener-class>
</listener>

<filter>
    <filter-name>log4jServletFilter</filter-name>
    <filter-class>org.apache.logging.log4j.web.Log4jServletFilter</filter-class>
</filter>
<filter-mapping>
    <filter-name>log4jServletFilter</filter-name>
    <url-pattern>/*</url-pattern>
    <dispatcher>REQUEST</dispatcher>
    <dispatcher>FORWARD</dispatcher>
    <dispatcher>INCLUDE</dispatcher>
    <dispatcher>ERROR</dispatcher>
</filter-mapping>

5、測試調用

import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;

private static Logger logger = LogManager.getLogger(APIV1Filter.class);

logger.info(..);
logger.error(..)

 

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