![](https://img.laitimes.com/img/__Qf2AjLwojIjJCLyojI0JCLicmbw5CZkR2MiZjYkVGZxMmZmBjY5EDO4YWZlZWZlFmNkRmYm9CX0JXZ252bj91Ztl2Lc52YucWbp5GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.png)
引言
對于一個線上程式或者服務而言,重要的是要有日志輸出,這樣才能友善運維。而日志的輸出需要有一定的規劃,如日志命名、日志大小,日志分割的檔案個數等。在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依賴
這邊要注意的是:
- 在引入log4j2時,需要排除掉Logback日志架構的依賴。
- 如果是
的Spring Boot才支援1.3.x及以下版本
的日志配置。log4j
log4j2.xml配置路徑
log4j2一般可以通過
xml,json,yaml
或者
properties
形式檔案來實作,我們這邊主要介紹
xml
檔案格式。
預設路徑
引入
log4j2
依賴後,預設在
src/main/resources目錄
下加入
log4j2.xml配置檔案
對日志進行配置即可,然後在
application.yml
中進行通路路徑的配置。
示例如下:
- log4j2.xml部署位置 在代碼工程中的src/main/resources目錄下放入配置檔案。
- yml配置
自定義部署位置
當然我們也可以在微服務部署的
config/
目錄下放置,然後在
application.yml
中進行通路路徑的配置。
示例如下:我們的micro-service01部署中配置的log4j2.xml路徑。
- log4j2.xml部署位置
- 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。如:
屬性
-
:是用于指定log4j的級别;status
-
:是用于指定log4j自動重新檢測讀取配置内容的間隔時間,機關為秒(s),最小值為5秒。monitorterval
Properties
變量配置,如模闆中的
./service-logs
,我們可以配置日志的路徑。後續日志存放的字首路徑即為
./service-logs
下,
中配置了字首,app.log就會存放在
./service-logs
下。
Appenders
Console
Console節點用于定義輸出控制台的Appender。屬性
-
:用于指定Appender的名稱;name
-
:用于指定輸出目标,一般是target
或SYSTEM_OUT
,預設是SYSTEM_ERR
;SYSTEM_OUT
節點
-
:用于指定輸出格式,不設定的話,預設為PatternLayout
:%m%n
File
File節點用于将日志輸出到指定檔案,一般不用該節點,而使用
RollingFile
節點。屬性
-
:用于指定Appender的名稱;name
-
:用于指定日志檔案的全路徑;fileName
節點
-
:用于指定輸出格式,不設定的話,預設為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
進行日志寫入。
屬性
-
:用于指定Appender的名稱;name
-
:用于指定日志檔案的全路徑;fileName
-
:用于指定分割檔案的日志全路徑(命名規則)。filePattern
節點
-
:用于指定輸出格式,不設定的話,預設為PatternLayout
;:%m%n
-
:設定日志檔案切割參數;Policies
-
:Policies的子節點,用于設定基于日志檔案大小觸發的滾動政策,SizeBasedTriggeringPolicy
屬性用來指定每個分割的日志檔案大小。size
-
:Policies的子節點,用于設定基于時間間隔觸發的滾動政策,TimeBasedTriggeringPolicy
屬性用于指定滾動時間間隔,預設是1小時,interval
屬性是用于對interval進行偏移調節,預設為false。若為true,則第一次觸發時是第一個小時觸發,後續以interval間隔觸發。modulate
-
:Policies的子節點,用于設定基于Cron表達式觸發的滾動政策。CronTriggeringPolicy
-
:設定預設政策設定。DefaultRolloverStrategy
Loggers
節點
-
:用于指定項目的根日志,Root
屬性表示日志輸出級别,子節點level
用于指定輸出到某個Appender,子節點的AppenderRef
屬性也就是前面的RollingFile中指定的name名稱,子節點的ref
也是日志輸出級别。level
-
:用于指定日志的形式,指定不同包的日志級别,Logger
屬性表示日志輸出級别,level
屬性用來指定該Logger所适用的類或者類的全路徑。子節點name
用于指定日志輸出到哪個Appender,若沒有指定,預設內建自Root。AppenderRef
參考
log4j2的官網位址
[每篇微語]
偉大的靈魂是向往懷疑的。
——尼采