1. 程式人生 > >spring+maven+log4j2 配置

spring+maven+log4j2 配置

什麼是log4j2

log4j是Apache提供的一個日誌實現,是一個基於Java的日誌記錄工具,有log4j1跟log4j2兩個版本。log4j2是log4j的升級版本。log4j2支援log4j1.2,slf4j、commons loggin和java.util.loggin API。
本文使用log4j2+slf4j進行配置。slf4j不是一個真正的日誌實現,而是一個抽象層,相當於一個統一的介面,它允許你在後臺使用任意一個日誌類庫。我們使用slf4j提供的介面進行日誌記錄的程式設計,當我們需要更換具體的日誌實現時,可以不改日誌程式碼,只要加入相應的jar包跟配置就可以實現切換。例如從logback到log4j2的切換,只需將logback相關jiar包改為log4j2相關jar包即可。

需要引入的jar包

在maven配置檔案中加入以下依賴jar包

<dependency>
            <groupId>org.apache.logging.log4j</groupId>
            <artifactId>log4j-core</artifactId>
            <version>2.6.2</version>
        </dependency>
        <dependency>
            <groupId
>
org.apache.logging.log4j</groupId> <artifactId>log4j-api</artifactId> <version>2.6.2</version> </dependency> <dependency> <!-- 橋接:告訴Slf4j使用Log4j2 --> <groupId>org.apache.logging.log4j</groupId
>
<artifactId>log4j-slf4j-impl</artifactId> <version>2.6.2</version> </dependency> <dependency> <groupId>org.slf4j</groupId> <!-- 橋接:log4j1使用Log4j2 也支援其他實現到log4j的橋接,引入不同的jar包即可--> <artifactId>log4j-over-slf4j</artifactId> <version>1.7.12</version> </dependency> <!-- 使用非同步寫日誌功能 必須引入此包--> <dependency> <groupId>com.lmax</groupId> <artifactId>disruptor</artifactId> <version>3.3.6</version> </dependency>

xml方式log4j配置

可以通過以下四種方式配置log4j2

  • 通過一個格式為xml或json的配置檔案
  • 以程式設計方式,通過建立一個ConfigurationFactory工廠和Configuration實現
  • 以程式設計方式,通過api暴露在配置介面新增元件的博人方式
  • 以程式設計方式,通過呼叫Logger內部類上的方法

配置檔案優先順序及存放位置

log4j2不在支援log2j1中的.properties字尾的檔案配置方式。log4j2版本配置檔案字尾只能為xml、json或jsn。
系統選擇配置的檔案的優先順序如下:

  1. classpath下的名為log4j2-test.json或者log4j-test.jsn檔案
  2. classpath下名為log4j2-test.xml的檔案
  3. classpath下名為log4j2.json或者log4j2.jsn的檔案
  4. classpath下名為log4j2.xml的檔案

我們一般預設使用log4j2.xml進行命名。如果本地測試,可以先把log4j2-test.xml放到classpath,而正式環境使用log4j2.xml,則在打包部署的時候不要打包log4j2-test.xml

首先先來看一個例子

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

<!-- status : 這個用於設定log4j2自身內部的資訊輸出,可以不設定,當設定成trace時,會看到log4j2內部各種詳細輸出 ,預設OFF
    monitorInterval : Log4j能夠自動檢測修改配置檔案和重新配置本身, 設定間隔秒數。 
    %d{yyyy-MM-dd HH:mm:ss, SSS} : 日誌生產時間 
    %p : 日誌輸出格式 
    %c : logger的名稱  
    %m : 日誌內容,即 logger.info("message") 
    %n : 換行符 
    %C : Java類名 
    %L : 日誌輸出所在行數 
    %M : 日誌輸出所在方法名 
    hostName : 本地機器名 hostAddress : 本地ip地址 -->

<Configuration status="debug" strict="true">

    <properties>
        <property name="LOG_HOME">${sys:catalina.home}/logs/</property>
    </properties>
    <Appenders>
        <!--這個輸出控制檯的配置 -->
        <Console name="Console" target="SYSTEM_OUT">
            <!--控制檯只輸出level及以上級別的資訊(onMatch),其他的直接拒絕(onMismatch)-->
            <ThresholdFilter level="trace" onMatch="ACCEPT" onMismatch="DENY"/>
            <!-- 輸出日誌的格式 -->
            <PatternLayout pattern="%d{DEFAULT} %c{1} %p [%t] %m%n"/>
        </Console>

        <!--檔案會打印出所有資訊,這個log每次執行程式會自動清空,由append屬性決定是否清空-->
            <File name="log" fileName="${LOG_HOME}/log/test.log" append="false">
                 <!-- 輸出的日誌格式 -->
                <PatternLayout pattern="%d{HH:mm:ss.SSS} %-5level %class{36} %L %M - %msg%xEx%n"/>
            </File> 

        <!--這個會打印出所有的資訊 每個小時自動按年月日時進行壓縮 -->
        <RollingFile name="appLog"
                     fileName="${LOG_HOME}info/info.log"
                     filePattern="${LOG_HOME}info/info.log.%d{yyyy-MM-dd-HH}.log.gz"
                     append="true"
        >
            <!-- 日誌列印格式-->
            <PatternLayout pattern="%d{DEFAULT} | %c{1} | %p | [%t] | %m%n"/>
            <Policies>
                <!-- 此處是按時間進行壓縮 根據filePattern中的時間格式   每隔一個單位進行壓縮-->
                <TimeBasedTriggeringPolicy interval="1" modulate="true"/>
            </Policies>
        </RollingFile>

        <Async name="asyncAppLog">
            <AppenderRef ref="appLog"/>
        </Async>

        <!-- error日誌格式 -->
        <!--配置多個Rollingfile地址,還需要在root下新增appender-ref ref="asyncErrorLog"/> 只顯示error級別的資訊 -->
        <RollingFile name="errorLog" fileName="${LOG_HOME}error/error.log"
                     filePattern="${LOG_HOME}error/error.log.%d{yyyy-MM-dd}.log.gz">
             <!-- 日誌列印格式-->
            <PatternLayout pattern="%d{DEFAULT} | %c{10} | %p | [%t] | %m%n"/>
            <Policies>
                <!-- 日誌壓縮觸發條件 -->
                <!-- 每次日誌超過size配置的大小,按filePattern的配置的格式進行壓縮>
                <SizeBasedTriggeringPolicy size="250 MB"/>
                <!-- 此處是按時間進行壓縮 根據filePattern中的時間格式 每隔一個單位進行壓縮 此處是按天壓縮-->
                <TimeBasedTriggeringPolicy interval="1" modulate="true"/>
            </Policies>
        </RollingFile>
        <Async name="asyncErrorLog">
            <AppenderRef ref="errorLog"/>
        </Async>
    </Appenders>

    <!--定義logger,只有定義了logger並引入的appender,appender才會生效 -->
    <Loggers>
    <!-- 配置日誌的根節點,建立一個預設的root的logger,需要在root的level中指定輸出的級別  -->
        <Root level="info">
            <AppenderRef ref="asyncAppLog"/>
        </Root>
        <AsyncLogger name="logger.error" level="info" additivity="false">
            <AppenderRef ref="asyncErrorLog"/>
        </AsyncLogger>
    </Loggers>
</Configuration>

log4j配置檔案詳解

logs4j配置

  • Configuration節點中有兩個屬性:status和monitorInterval。

    • status表示log4j自己的日誌列印級別,如果設定為TRACE,可以看到控制檯輸出log4j本身的日誌資訊。
    • monitorInterval表示每隔多少秒自動檢測配置檔案的更改,單位是秒,最小的時間間隔是5秒。
  • Configuration有兩個子節點Appenders和Loggers

    • 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 : RollingFile子節點,輸出格式,不設定預設為%m%n.
        • filePattern:指定新建日誌檔案的名稱格式
        • Policies:指定滾動日誌的策略,就是什麼時候進行新建日誌檔案輸出日誌
          • TimeBasedTriggeringPolicy:Policies子節點,基於時間的滾動策略,interval屬性用來指定多久滾動一次,預設是1hour。modulate=true用來調整時間。比如現在是早上3點,interval是4沒那麼第一次滾動是在早上4點,接著是8am,12am..而不是7am
          • SizeBasedTriggeringPolicy:Policies子節點,基於指定檔案大小的滾動策略,size屬性用來定義每個日誌檔案的大小。
          • DefaultRolloverStrategy:用來指定同一個資料夾下最多有幾個日誌檔案時開始刪除最舊的,建立新的(通過max)
    • Loggers節點,常見的有兩種:Root和Logger

      • Root節點用來指定專案的根日誌,如果沒有單獨指定Logger,那麼久會預設使用該Root日誌輸出
        • level:日誌輸出級別,共有8個級別,按照從低到高:ALL-Trace-Debug-Info-Warn-Error-Fatal-OFF
        • name: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中進行輸出。
    • 關於日誌level
      • 共有8個級別,按照從低到高ALL-Trace-Debug-Info-Warn-Error-Fatal-OFF
      • ALL:最低等級,用於開啟所有日誌記錄
      • Trace:是追蹤,就是程式推進以下,你就可以寫個trace輸出,所以trace應該會特別多,不過沒關係,我們可以設定最低日誌級別不讓他輸出
      • Debug:指出細粒度資訊事件對除錯應用程式是非常有幫助的
      • Info:訊息在粗粒度級別上突出強呼叫用程式的執行過程
      • Warn:輸出警告及warn以下級別的日誌
      • Error:輸出錯誤資訊日誌
      • Fatal:輸出每個嚴重的錯誤事件將會導致應用程式退出的日誌
      • OFF:最高等級,用於關閉所有的日誌記錄
        程式會列印高於或等於所設定級別的日誌,設定級別的日誌越高,打印出來的日誌就越少

PatternLayou格式設定

%d{yyyy-MM-dd HH:mm:ss.SSS}:表示輸出的日期格式

%t:表示當前執行緒名稱

%-5level:輸出日誌級別,-5表示左對齊並且固定輸出5個字元

%l:輸出語句所在的包名、類名、函式名、行數

%msg:輸出日誌的內容

%n:換行

%F 輸出所在的類檔名

%L 輸出行號

%M 輸出所在方法名

java 中使用

private final static Logger LOGGER = LoggerFactory.getLogger(clazz);

private static final Logger ERROR_LOG = LoggerFactory.getLogger("logger.error");

private static final Logger TEST_LOG = LoggerFactory.getLogger("logger.test");
LOGGER.info("info日誌");
ERROR_LOG.error("error日誌");
TEST_LOG.error("test日誌");