天天看點

SpringBoot—整合log4j2入門和log4j2.xml配置詳解

本文主要介紹SpringBoot—log4j2入門和log4j2.xml配置詳解。

關注微信公衆号:CodingTechWork,一起學習進步。

引言

  對于一個線上程式或者服務而言,重要的是要有日志輸出,這樣才能友善運維。而日志的輸出需要有一定的規劃,如日志命名、日志大小,日志分割的檔案個數等。在Spring的架構下,我們可以使用

log4j

來進行日志的設定,高版本的SpringBoot會使用

log4j2

介紹

log4j2概述

  截取官網的原話:

Apache Log4j 2 is an upgrade to Log4j that provides significant improvements over its predecessor, Log4j 1.x, and provides many of the improvements available in Logback while fixing some inherent problems in Logback’s architecture.

  Log4j其實可以了解為

log for java

,是以是java的日志架構,提供日志服務,而Log4j 2是Log4j的更新版本,性能比

logback

好。

  日志級别優先級從低到高:

ALL、DEBUG、 INFO、 WARN、 ERROR、FATAL、 OFF

。一般官網建議就使用

DEBUG、INFO、WARN和ERROR

這四個,但是我們可以加一個

ALL

最低級别的來進行總日志的輸出。日志的登記越高,打出的日志越少。

log4j2的pom依賴

<dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
            <exclusions>
                <exclusion>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-starter-logging</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-log4j2</artifactId>
        </dependency>
           

這邊要注意的是:

  1. 在引入log4j2時,需要排除掉Logback日志架構的依賴即。
<artifactId>spring-boot-starter-logging</artifactId>
           
  1. 如果是

    1.3.x及以下版本

    的Spring Boot才支援

    log4j

    的日志配置。
<dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
            <exclusions>
                <exclusion>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-starter-logging</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-log4j</artifactId>
        </dependency>
           

log4j2.xml配置路徑

  log4j2一般可以通過

xml,json,yaml

或者

properties

形式檔案來實作,我們這邊主要介紹

xml

檔案格式。

預設路徑

  引入

log4j2

依賴後,預設在

src/main/resources目錄

下加入

log4j2.xml配置檔案

對日志進行配置即可,然後在

application.yml

中進行通路路徑的配置。

  示例如下:

  1. log4j2.xml部署位置

    在代碼工程中的src/main/resources目錄下放入配置檔案。

  2. yml配置
#日志配置 無特殊需求無需更改
logging:
  config:  classpath:log4j2.xml
  level:
    root: INFO
    javax.activation: info
    org.apache.catalina: INFO
    org.apache.commons.beanutils.converters: INFO
    org.apache.coyote.http11.Http11Processor: INFO
    org.apache.http: INFO
    org.apache.tomcat: INFO
    org.springframework: INFO
    com.chinamobile.cmss.bdpaas.resource.monitor: DEBUG
           

自定義部署位置

當然我們也可以在微服務部署的

config/

目錄下放置,然後在

application.yml

  示例如下:我們的micro-service01部署中配置的log4j2.xml路徑。

[userA@linux01 config]$ pwd
/home/userA/SpringBoot/micro-service01/config
[userA@linux01 config]$ ll
total 24
-rwxr-xr-x 1 userA userA 5938 Sep  9 16:30 application.yml
-r-------- 1 userA userA 8342 Sep  8 16:33 log4j2.xml
           
#日志配置 無特殊需求無需更改
logging:
  config: /home/userA/SpringBoot/micro-service01/config/log4j2.xml
  level:
    root: INFO
    javax.activation: info
    org.apache.catalina: INFO
    org.apache.commons.beanutils.converters: INFO
    org.apache.coyote.http11.Http11Processor: INFO
    org.apache.http: INFO
    org.apache.tomcat: INFO
    org.springframework: INFO
    com.chinamobile.cmss.bdpaas.resource.monitor: DEBUG
           

log4j2.xml配置詳解

xml配置模闆

<?xml version="1.0" encoding="UTF-8"?>
<Configuration>
<!--<Configuration status="WARN" monitorInterval="30"> -->
    <properties>
        <property name="LOG_HOME">./service-logs</property>
    </properties>
    <Appenders>
        <!--*********************控制台日志***********************-->
        <Console name="consoleAppender" target="SYSTEM_OUT">
            <!--設定日志格式及顔色-->
            <PatternLayout
                    pattern="%style{%d{ISO8601}}{bright,green} %highlight{%-5level} [%style{%t}{bright,blue}] %style{%C{}}{bright,yellow}: %msg%n%style{%throwable}{red}"
                    disableAnsi="false" noConsoleNoAnsi="false"/>
        </Console>

        <!--*********************檔案日志***********************-->
        <!--all級别日志-->
        <RollingFile name="allFileAppender"
                     fileName="${LOG_HOME}/all.log"
                     filePattern="${LOG_HOME}/$${date:yyyy-MM}/all-%d{yyyy-MM-dd}-%i.log.gz">
            <!--設定日志格式-->
            <PatternLayout>
                <pattern>%d %p %C{} [%t] %m%n</pattern>
            </PatternLayout>
            <Policies>
                <!-- 設定日志檔案切分參數 -->
                <!--<OnStartupTriggeringPolicy/>-->
                <!--設定日志基礎檔案大小,超過該大小就觸發日志檔案滾動更新-->
                <SizeBasedTriggeringPolicy size="100 MB"/>
                <!--設定日志檔案滾動更新的時間,依賴于檔案命名filePattern的設定-->
                <TimeBasedTriggeringPolicy/>
            </Policies>
            <!--設定日志的檔案個數上限,不設定預設為7個,超過大小後會被覆寫;依賴于filePattern中的%i-->
            <DefaultRolloverStrategy max="100"/>
        </RollingFile>

        <!--debug級别日志-->
        <RollingFile name="debugFileAppender"
                     fileName="${LOG_HOME}/debug.log"
                     filePattern="${LOG_HOME}/$${date:yyyy-MM}/debug-%d{yyyy-MM-dd}-%i.log.gz">
            <Filters>
                <!--過濾掉info及更進階别日志-->
                <ThresholdFilter level="info" onMatch="DENY" onMismatch="NEUTRAL"/>
            </Filters>
            <!--設定日志格式-->
            <PatternLayout>
                <pattern>%d %p %C{} [%t] %m%n</pattern>
            </PatternLayout>
            <Policies>
                <!-- 設定日志檔案切分參數 -->
                <!--<OnStartupTriggeringPolicy/>-->
                <!--設定日志基礎檔案大小,超過該大小就觸發日志檔案滾動更新-->
                <SizeBasedTriggeringPolicy size="100 MB"/>
                <!--設定日志檔案滾動更新的時間,依賴于檔案命名filePattern的設定-->
                <TimeBasedTriggeringPolicy/>
            </Policies>
            <!--設定日志的檔案個數上限,不設定預設為7個,超過大小後會被覆寫;依賴于filePattern中的%i-->
            <DefaultRolloverStrategy max="100"/>
        </RollingFile>

        <!--info級别日志-->
        <RollingFile name="infoFileAppender"
                     fileName="${LOG_HOME}/info.log"
                     filePattern="${LOG_HOME}/$${date:yyyy-MM}/info-%d{yyyy-MM-dd}-%i.log.gz">
            <Filters>
                <!--過濾掉warn及更進階别日志-->
                <ThresholdFilter level="warn" onMatch="DENY" onMismatch="NEUTRAL"/>
            </Filters>
            <!--設定日志格式-->
            <PatternLayout>
                <pattern>%d %p %C{} [%t] %m%n</pattern>
            </PatternLayout>
            <Policies>
                <!-- 設定日志檔案切分參數 -->
                <!--<OnStartupTriggeringPolicy/>-->
                <!--設定日志基礎檔案大小,超過該大小就觸發日志檔案滾動更新-->
                <SizeBasedTriggeringPolicy size="100 MB"/>
                <!--設定日志檔案滾動更新的時間,依賴于檔案命名filePattern的設定-->
                <TimeBasedTriggeringPolicy interval="1" modulate="true />
            </Policies>
            <!--設定日志的檔案個數上限,不設定預設為7個,超過大小後會被覆寫;依賴于filePattern中的%i-->
            <!--<DefaultRolloverStrategy max="100"/>-->
        </RollingFile>

        <!--warn級别日志-->
        <RollingFile name="warnFileAppender"
                     fileName="${LOG_HOME}/warn.log"
                     filePattern="${LOG_HOME}/$${date:yyyy-MM}/warn-%d{yyyy-MM-dd}-%i.log.gz">
            <Filters>
                <!--過濾掉error及更進階别日志-->
                <ThresholdFilter level="error" onMatch="DENY" onMismatch="NEUTRAL"/>
            </Filters>
            <!--設定日志格式-->
            <PatternLayout>
                <pattern>%d %p %C{} [%t] %m%n</pattern>
            </PatternLayout>
            <Policies>
                <!-- 設定日志檔案切分參數 -->
                <!--<OnStartupTriggeringPolicy/>-->
                <!--設定日志基礎檔案大小,超過該大小就觸發日志檔案滾動更新-->
                <SizeBasedTriggeringPolicy size="100 MB"/>
                <!--設定日志檔案滾動更新的時間,依賴于檔案命名filePattern的設定-->
                <TimeBasedTriggeringPolicy/>
            </Policies>
            <!--設定日志的檔案個數上限,不設定預設為7個,超過大小後會被覆寫;依賴于filePattern中的%i-->
            <DefaultRolloverStrategy max="100"/>
        </RollingFile>

        <!--error及更進階别日志-->
        <RollingFile name="errorFileAppender"
                     fileName="${LOG_HOME}/error.log"
                     filePattern="${LOG_HOME}/$${date:yyyy-MM}/error-%d{yyyy-MM-dd}-%i.log.gz">
            <!--設定日志格式-->
            <PatternLayout>
                <pattern>%d %p %C{} [%t] %m%n</pattern>
            </PatternLayout>
            <Policies>
                <!-- 設定日志檔案切分參數 -->
                <!--<OnStartupTriggeringPolicy/>-->
                <!--設定日志基礎檔案大小,超過該大小就觸發日志檔案滾動更新-->
                <SizeBasedTriggeringPolicy size="100 MB"/>
                <!--設定日志檔案滾動更新的時間,依賴于檔案命名filePattern的設定-->
                <TimeBasedTriggeringPolicy/>
            </Policies>
            <!--設定日志的檔案個數上限,不設定預設為7個,超過大小後會被覆寫;依賴于filePattern中的%i-->
            <DefaultRolloverStrategy max="100"/>
        </RollingFile>

        <!--json格式error級别日志-->
        <RollingFile name="errorJsonAppender"
                     fileName="${LOG_HOME}/error-json.log"
                     filePattern="${LOG_HOME}/error-json-%d{yyyy-MM-dd}-%i.log.gz">
            <JSONLayout compact="true" eventEol="true" locationInfo="true"/>
            <Policies>
                <SizeBasedTriggeringPolicy size="100 MB"/>
                <TimeBasedTriggeringPolicy interval="1" modulate="true"/>
            </Policies>
        </RollingFile>
    </Appenders>

    <Loggers>
        <!-- 根日志設定 -->
        <Root level="debug">
            <AppenderRef ref="allFileAppender" level="all"/>
            <AppenderRef ref="consoleAppender" level="debug"/>
            <AppenderRef ref="debugFileAppender" level="debug"/>
            <AppenderRef ref="infoFileAppender" level="info"/>
            <AppenderRef ref="warnFileAppender" level="warn"/>
            <AppenderRef ref="errorFileAppender" level="error"/>
            <AppenderRef ref="errorJsonAppender" level="error"/>
        </Root>

        <!--spring日志-->
        <Logger name="org.springframework" level="debug"/>
        <!--druid資料源日志-->
        <Logger name="druid.sql.Statement" level="warn"/>
        <!-- mybatis日志 -->
        <Logger name="com.mybatis" level="warn"/>
        <Logger name="org.hibernate" level="warn"/>
        <Logger name="com.zaxxer.hikari" level="info"/>
        <Logger name="org.quartz" level="info"/>
        <Logger name="com.andya.demo" level="debug"/>
    </Loggers>

</Configuration>
           

配置參數詳解

Configuration

根節點

Configuration

中有兩個常用的屬性:status和monitorterval。如:

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

屬性

  1. status

    :是用于指定log4j的級别;
  2. monitorterval

    :是用于指定log4j自動重新檢測讀取配置内容的間隔時間,機關為秒(s),最小值為5秒。

Properties

<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="warn" name="MyApp" packages="">
  <properties>
     <property name="LOG_HOME">./service-logs</property>
  </properties>
  <Appenders>
    <File name="MyFile" fileName="${LOG_HOME}/app.log">
      <PatternLayout>
        <Pattern>%d %p %c{1.} [%t] %m%n</Pattern>
      </PatternLayout>
    </File>
  </Appenders>
  <Loggers>
    <Root level="error">
      <AppenderRef ref="MyFile"/>
    </Root>
  </Loggers>
</Configuration>
           

變量配置,如模闆中的

<property name="LOG_HOME">./service-logs</property>

,我們可以配置日志的路徑。後續日志存放的字首路徑即為

./service-logs

下,

<File name="MyFile" fileName="${LOG_HOME}/app.log">

中配置了字首,app.log就會存放在

./service-logs

下。

Appenders

Console

<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="warn" name="MyApp" packages="">
  <Appenders>
    <Console name="STDOUT" target="SYSTEM_OUT">
      <PatternLayout pattern="%m%n"/>
    </Console>
  </Appenders>
  <Loggers>
    <Root level="error">
      <AppenderRef ref="STDOUT"/>
    </Root>
  </Loggers>
</Configuration>
           

  Console節點用于定義輸出控制台的Appender。

  1. name

    :用于指定Appender的名稱;
  2. target

    :用于指定輸出目标,一般是

    SYSTEM_OUT

    SYSTEM_ERR

    ,預設是

    SYSTEM_OUT

節點

  1. PatternLayout

    :用于指定輸出格式,不設定的話,預設為

    :%m%n

File

<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="warn" name="MyApp" packages="">
  <Appenders>
    <File name="MyFile" fileName="logs/app.log">
      <PatternLayout>
        <Pattern>%d %p %c{1.} [%t] %m%n</Pattern>
      </PatternLayout>
    </File>
  </Appenders>
  <Loggers>
    <Root level="error">
      <AppenderRef ref="MyFile"/>
    </Root>
  </Loggers>
</Configuration>
           

  File節點用于将日志輸出到指定檔案,一般不用該節點,而使用

RollingFile

節點。

  1. name

  2. fileName

    :用于指定日志檔案的全路徑;
  1. PatternLayout

    :%m%n

RollingFile

  RollingFile節點用于實作日志檔案更動更新的Appender,當滿足條件(日志大小、指定時間等)重命名或打包原日志檔案進行歸檔,生成新日志檔案用于日志寫入。

  我們可以設定

ALL、DEBUG、 INFO、 WARN、 ERROR

這些級别的RollingFileAppender。

(1)基于大小的滾動政策
<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="warn" name="MyApp" packages="">
  <Appenders>
    <RollingFile name="RollingFile" fileName="logs/app.log"
                 filePattern="logs/$${date:yyyy-MM}/app-%d{MM-dd-yyyy}-%i.log.gz">
      <PatternLayout>
        <Pattern>%d %p %c{1.} [%t] %m%n</Pattern>
      </PatternLayout>
      <Policies>
        <TimeBasedTriggeringPolicy />
        <SizeBasedTriggeringPolicy size="100 MB"/>
      </Policies>
      <DefaultRolloverStrategy max="10"/>
    </RollingFile>
  </Appenders>
  <Loggers>
    <Root level="error">
      <AppenderRef ref="RollingFile"/>
    </Root>
  </Loggers>
</Configuration>
           

  上述模闆中,日志先寫入

logs/app.log

中,每當檔案大小達到100MB時或經過1天,按照在

logs/2020-09/

目錄下以

app-2020-09-09-1.log.gz

格式對該日志進行壓縮重命名并歸檔,并生成新的檔案

app.log

進行日志寫入。

  其中,

filePattern

屬性的檔案格式中

%i

就類似于一個整數計數器,受到

<DefaultRolloverStrategy max="10"/>

控制,要特别注意的是:當檔案個數達到10個的時候會

循環覆寫

前面已歸檔的1-10個檔案。若不設定該參數,預設為

7

(2)基于時間間隔的滾動政策
<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="warn" name="MyApp" packages="">
  <Appenders>
    <RollingFile name="RollingFile" fileName="logs/app.log"
                 filePattern="logs/$${date:yyyy-MM}/app-%d{yyyy-MM-dd-HH}.log.gz">
      <PatternLayout>
        <Pattern>%d %p %c{1.} [%t] %m%n</Pattern>
      </PatternLayout>
      <Policies>
        <TimeBasedTriggeringPolicy interval="6" modulate="true"/>
      </Policies>
    </RollingFile>
  </Appenders>
  <Loggers>
    <Root level="error">
      <AppenderRef ref="RollingFile"/>
    </Root>
  </Loggers>
</Configuration>
           

logs/app.log

中,每當檔案的時間間隔到達6小時(由

%d{yyyy-MM-dd-HH}

決定,也可以設定成

%d{yyyy-MM-dd-HH-mm}

,則間隔為分鐘級别),觸發rollover操作。

  如上配置設定好後,10點的日志開始重新開機服務,則從11點觸發一次rollover操作,生成

2020-09-09-10.log.gz

對該日志進行壓縮重命名并歸檔,并生成新的檔案

app.log

進行日志寫入;然後,每間隔6小時,則下一次是17點觸發一次,生成

2020-09-09-17.log.gz

app.log

(3)基于時間間隔和檔案大小的滾動政策
<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="warn" name="MyApp" packages="">
  <Appenders>
    <RollingFile name="RollingFile" fileName="logs/app.log"
                 filePattern="logs/$${date:yyyy-MM}/app-%d{yyyy-MM-dd-HH}-%i.log.gz">
      <PatternLayout>
        <Pattern>%d %p %c{1.} [%t] %m%n</Pattern>
      </PatternLayout>
      <Policies>
        <TimeBasedTriggeringPolicy interval="6" modulate="true"/>
        <SizeBasedTriggeringPolicy size="100 MB"/>
      </Policies>
    </RollingFile>
  </Appenders>
  <Loggers>
    <Root level="error">
      <AppenderRef ref="RollingFile"/>
    </Root>
  </Loggers>
</Configuration>
           

logs/app.log

中,每當檔案大小達到100MB或者當時間間隔到達6小時(由

%d{yyyy-MM-dd-HH}

決定),觸發rollover操作,按照在

logs/2020-09/

app-2020-09-09-1.log.gz

app.log

  1. name

  2. fileName

  3. filePattern

    :用于指定分割檔案的日志全路徑(命名規則)。
  1. PatternLayout

    :%m%n

  2. Policies

    :設定日志檔案切割參數;
  3. SizeBasedTriggeringPolicy

    :Policies的子節點,用于設定基于日志檔案大小觸發的滾動政策,

    size

    屬性用來指定每個分割的日志檔案大小。
  4. TimeBasedTriggeringPolicy

    :Policies的子節點,用于設定基于時間間隔觸發的滾動政策,

    interval

    屬性用于指定滾動時間間隔,預設是1小時,

    modulate

    屬性是用于對interval進行偏移調節,預設為false。若為true,則第一次觸發時是第一個小時觸發,後續以interval間隔觸發。
  5. CronTriggeringPolicy

    :Policies的子節點,用于設定基于Cron表達式觸發的滾動政策。
  6. DefaultRolloverStrategy

    :設定預設政策設定。

Loggers

  1. Root

    :用于指定項目的根日志,

    level

    屬性表示日志輸出級别,子節點

    AppenderRef

    用于指定輸出到某個Appender,子節點的

    ref

    屬性也就是前面的RollingFile中指定的name名稱,子節點的

    level

    也是日志輸出級别。
  2. Logger

    :用于指定日志的形式,指定不同包的日志級别,

    level

    屬性表示日志輸出級别,

    name

    屬性用來指定該Logger所适用的類或者類的全路徑。子節點

    AppenderRef

    用于指定日志輸出到哪個Appender,若沒有指定,預設內建自Root。

參考

log4j2的官網位址

燒不死的鳥就是鳳凰

繼續閱讀