天天看點

log4j2 配置詳解_SpringBoot—整合log4j2入門和log4j2.xml配置詳解引言介紹log4j2.xml配置詳解

log4j2 配置詳解_SpringBoot—整合log4j2入門和log4j2.xml配置詳解引言介紹log4j2.xml配置詳解

引言

  對于一個線上程式或者服務而言,重要的是要有日志輸出,這樣才能友善運維。而日志的輸出需要有一定的規劃,如日志命名、日志大小,日志分割的檔案個數等。在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依賴

這邊要注意的是:

  1. 在引入log4j2時,需要排除掉Logback日志架構的依賴。
  1. 如果是

    1.3.x及以下版本

    的Spring Boot才支援

    log4j

    的日志配置。

log4j2.xml配置路徑

  log4j2一般可以通過

xml,json,yaml

或者

properties

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

xml

檔案格式。

預設路徑

  引入

log4j2

依賴後,預設在

src/main/resources目錄

下加入

log4j2.xml配置檔案

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

application.yml

中進行通路路徑的配置。

  示例如下:

  1. log4j2.xml部署位置 在代碼工程中的src/main/resources目錄下放入配置檔案。
  2. yml配置

自定義部署位置

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

config/

目錄下放置,然後在

application.yml

中進行通路路徑的配置。

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

  1. log4j2.xml部署位置
  1. yml配置

log4j2.xml配置詳解

xml配置模闆

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

    <properties>
        <property name="LOG_HOME">./service-logsproperty>
    properties>
    <Appenders>
        
        <Console name="consoleAppender" target="SYSTEM_OUT">
            
            <PatternLayoutpattern="%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>

        
        
        <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%npattern>
            PatternLayout>
            <Policies>
                
                
                
                <SizeBasedTriggeringPolicy size="100 MB"/>
                
                <TimeBasedTriggeringPolicy/>
            Policies>
            
            <DefaultRolloverStrategy max="100"/>
        RollingFile>

        
        <RollingFile name="debugFileAppender"fileName="${LOG_HOME}/debug.log"filePattern="${LOG_HOME}/$${date:yyyy-MM}/debug-%d{yyyy-MM-dd}-%i.log.gz">
            <Filters>
                
                <ThresholdFilter level="info" onMatch="DENY" onMismatch="NEUTRAL"/>
            Filters>
            
            <PatternLayout>
                <pattern>%d %p %C{} [%t] %m%npattern>
            PatternLayout>
            <Policies>
                
                
                
                <SizeBasedTriggeringPolicy size="100 MB"/>
                
                <TimeBasedTriggeringPolicy/>
            Policies>
            
            <DefaultRolloverStrategy max="100"/>
        RollingFile>

        
        <RollingFile name="infoFileAppender"fileName="${LOG_HOME}/info.log"filePattern="${LOG_HOME}/$${date:yyyy-MM}/info-%d{yyyy-MM-dd}-%i.log.gz">
            <Filters>
                
                <ThresholdFilter level="warn" onMatch="DENY" onMismatch="NEUTRAL"/>
            Filters>
            
            <PatternLayout>
                <pattern>%d %p %C{} [%t] %m%npattern>
            PatternLayout>
            <Policies>
                
                
                
                <SizeBasedTriggeringPolicy size="100 MB"/>
                
                <TimeBasedTriggeringPolicy interval="1" modulate="true />RollingFile><RollingFile name="warnFileAppender"fileName="${LOG_HOME}/warn.log"filePattern="${LOG_HOME}/$${date:yyyy-MM}/warn-%d{yyyy-MM-dd}-%i.log.gz"><Filters><ThresholdFilter level="error" onMatch="DENY" onMismatch="NEUTRAL"/>Filters><PatternLayout><pattern>%d %p %C{} [%t] %m%npattern>PatternLayout><Policies><SizeBasedTriggeringPolicy size="100 MB"/><TimeBasedTriggeringPolicy/>Policies><DefaultRolloverStrategy max="100"/>RollingFile><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%npattern>PatternLayout><Policies><SizeBasedTriggeringPolicy size="100 MB"/><TimeBasedTriggeringPolicy/>Policies><DefaultRolloverStrategy max="100"/>RollingFile><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><Logger name="org.springframework" level="debug"/><Logger name="druid.sql.Statement" level="warn"/><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。如:

屬性

  1. status

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

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

Properties

變量配置,如模闆中的

./service-logs

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

./service-logs

下,    

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

./service-logs

下。

Appenders

Console

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

  1. name

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

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

    SYSTEM_OUT

    SYSTEM_ERR

    ,預設是

    SYSTEM_OUT

節點

  1. PatternLayout

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

    :%m%n

File

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

RollingFile

節點。屬性

  1. name

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

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

節點

  1. PatternLayout

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

    :%m%n

RollingFile

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

  我們可以設定

ALL、DEBUG、 INFO、 WARN、 ERROR

這些級别的RollingFileAppender。

(1)基于大小的滾動政策

  上述模闆中,日志先寫入

logs/app.log

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

logs/2020-09/

目錄下以

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

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

app.log

進行日志寫入。

  其中,

filePattern

屬性的檔案格式中

%i

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

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

循環覆寫

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

7

(2)基于時間間隔的滾動政策

  上述模闆中,日志先寫入

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)基于時間間隔和檔案大小的滾動政策

  上述模闆中,日志先寫入

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

    :用于指定Appender的名稱;
  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的官網位址

[每篇微語]

偉大的靈魂是向往懷疑的。

                        ——尼采