本文主要介紹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>
這邊要注意的是:
- 在引入log4j2時,需要排除掉Logback日志架構的依賴即。
<artifactId>spring-boot-starter-logging</artifactId>
- 如果是
的Spring Boot才支援1.3.x及以下版本
的日志配置。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
中進行通路路徑的配置。
示例如下:
-
log4j2.xml部署位置
在代碼工程中的src/main/resources目錄下放入配置檔案。
- 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">
屬性
-
:是用于指定log4j的級别;status
-
:是用于指定log4j自動重新檢測讀取配置内容的間隔時間,機關為秒(s),最小值為5秒。monitorterval
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。
-
:用于指定Appender的名稱;name
-
:用于指定輸出目标,一般是target
或SYSTEM_OUT
,預設是SYSTEM_ERR
;SYSTEM_OUT
節點
-
:用于指定輸出格式,不設定的話,預設為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
節點。
-
name
-
:用于指定日志檔案的全路徑;fileName
-
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
-
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的官網位址
燒不死的鳥就是鳳凰