Spring?Boot整合log4j2日志配置的詳細(xì)教程
前言
在項目推進中,如果說第一件事是搭建 Spring 框架的話,那么第二件事情就是在 Sring 基礎(chǔ)上搭建日志框架,此篇文章是博主在學(xué)習(xí)過程中使用 Spring Boot 搭建項目時整合 Log4j2 日志的總結(jié)
一、常用日志框架
- java.util.logging:是 JDK 在1.4版本中引入的 Java 原生日志框架
- Log4j:Apache 的一個開源項目,可以控制日志信息輸送的目的地是控制臺、文件、GUI組件等
- LogBack:是 Log4j 的一個改良版本
- Log4j2:Log4j2 已經(jīng)不僅僅是 Log4j 的一個升級版本了,它從頭到尾都被重寫了
二、配置參數(shù)介紹
1. 日志級別
共有8個級別,按照從低到高為:All < Trace < Debug < Info < Warn < Error < Fatal < OFF
機制:如果一條日志信息的級別大于等于配置文件的級別,就記錄
- All:最低等級的,用于打開所有日志記錄
- Trace:追蹤,就是程序推進一下,可以寫個 trace 輸出
- Debug:調(diào)試,指出細(xì)粒度信息事件,對調(diào)試應(yīng)用程序是非常有幫助的
- Info:消息在粗粒度級別上突出強調(diào)應(yīng)用程序的運行過程
- Warn:輸出警告及 warn 以下級別的日志,有些信息不是錯誤信息,但也要給程序員一些提示
- Error:輸出錯誤信息日志
- Fatal:輸出每個嚴(yán)重的錯誤,將會導(dǎo)致應(yīng)用程序的退出的日志
- OFF:最高等級,用于關(guān)閉所有日志記錄
2. 輸出形式
- CONSOLE(輸出到控制臺)
- FILE(輸出到文件)
3. 日志格式
- SimpleLayout:以簡單的形式顯示
- HTMLLayout:以 HTML 表格顯示
- PatternLayout:自定義形式顯示
3.1 PatternLayout 自定義日志布局
Console 節(jié)點、File 節(jié)點、RollingFile 節(jié)點的子節(jié)點,指定輸出格式,不設(shè)置默認(rèn)為:%m%n
屬性:
- pattern:指定日志格式
自定義日志格式:
%d{yyyy-MM-dd HH:mm:ss, SSS}: 日志生產(chǎn)時間,輸出到毫秒的時間
%-5level: 輸出日志級別,-5表示左對齊并且固定輸出5個字符,如果不足在右邊補0
%p: 日志輸出格式
%c: logger的名稱(%logger)
%m : 日志內(nèi)容, 即 logger.info("message")
%n: 換行符
%C: Java類名(%F)
%L: 日志輸出所在行數(shù)
%M: 日志輸出所在方法名
%l: 輸出語句所在的行數(shù), 包括類名、方法名、文件名、行數(shù)
%t: 表示線程名(%thread)
hostName: 本地機器名
hostAddress: 本地ip地址
三、Log4j2 配置詳解
1. 根節(jié)點 Configuration
log4j2.xml 的根節(jié)點,有兩個屬性,兩個子節(jié)點
屬性:
- status:用來指定 log4j 本身的打印日志的級別
- monitorinterval:用來指定 log4j 自動重新配置的監(jiān)測間隔時間,單位:s,最小是 5s
子節(jié)點:
- Appenders
- Loggers (表明可以定義多個 Appender 和 Logger)
2. Appenders 節(jié)點
Configuration 根節(jié)點的子節(jié)點,常見的有三種子節(jié)點:Console、File、RollingFile
2.1 Console 節(jié)點
Appenders 節(jié)點的子節(jié)點,用來定義輸出到控制臺的 Appender
屬性:
- name:用來指定 Appender 的名字
- target:可選值 SYSTEM_OUT 或 SYSTEM_ERR。一般只設(shè)置默認(rèn):SYSTEM_OUT
子節(jié)點:
- PatternLayout:輸出格式,默認(rèn)值:%m%n
2.2 File 節(jié)點
Appenders 節(jié)點的子節(jié)點,用來定義輸出到指定位置的文件的 Appender,一般用來測試輸出
屬性:
- name:用來指定 Appender 的名字
- fileName:指定輸出日志的目的文件帶全路徑的文件名
子節(jié)點:
- PatternLayout:輸出格式,默認(rèn)值:%m%n
- ThresholdFilter:指定輸出級別
2.3 RollingFile 節(jié)點
Appenders 節(jié)點的子節(jié)點,用來定義超過指定大小,自動刪除舊的創(chuàng)建新的 Appender
屬性:
- name:用來指定 Appender 的名稱
- fileName:指定輸出日志的目的文件帶全路徑的文件名
- filePattern:指定新建日志文件的名稱格式
子節(jié)點:
- ThresholdFilter:決定日志事件能否被輸出
- PatternLayout:輸出格式,默認(rèn)值:%m%n
- Policies:指定滾動日志的策略,就是什么時候進行新建日志文件輸出日志
- DefaultRolloverStrategy:用來指定同一個文件夾下最多有幾個日志文件時,開始刪除最舊的,創(chuàng)建新的日志文件(通過 max 屬性)
2.3.1 ThresholdFilter 節(jié)點
RollingFile 節(jié)點的子節(jié)點,決定日志事件能否被輸出。過濾條件有三個值:ACCEPT (接受),DENY (拒絕) or NEUTRAL (中立)
屬性:
- level:指定過濾日志的級別
- onMatch:默認(rèn)值是 NEUTRAL
- onMismatch:默認(rèn)值是 DENY
2.3.2 Policies 節(jié)點
RollingFile 節(jié)點的子節(jié)點,指定滾動日志的策略
子節(jié)點:
- TimeBasedTriggeringPolicy:基于時間的滾動策略,interval 屬性用來指定多久滾動一次,默認(rèn)是 1hour。modulate = true 用來調(diào)整時間
- SizeBasedTriggeringPolicy:基于指定文件大小的滾動策略,size 屬性用來定義每個日志文件的大小
2.3.3 ThresholdFilter 節(jié)點
3. Loggers 節(jié)點
Configuration 根節(jié)點的子節(jié)點
子節(jié)點:
- Root:用來指定項目的根日志,如果沒有單獨指定 Logger,那么就會默認(rèn)使用該 Root 日志輸出
- Logger:用來單獨指定日志的形式,比如要為指定包下的 class 指定不同的日志級別等
3.1 Root 節(jié)點
Loggers 節(jié)點的子節(jié)點
屬性:
- level:指定日志輸出級別
子節(jié)點:
- appender-ref:用來指定該日志輸出到哪個 Appender,通過 ref 指定
3.2 Logger 節(jié)點
屬性:
- level:指定日志輸出級別
- name:用來指定該 Logger 所適用的類或者類所在的包全路徑,繼承自 Root 節(jié)點
子節(jié)點:
- appender-ref:用來指定該日志輸出到哪個Appender,通過 ref 指定
四、Log4j2 使用步驟
1. pom.xml 添加依賴
Spring Boot 默認(rèn)是用 logback 的日志框架的,所以需要排除 logback,不然會出現(xiàn) jar 依賴沖突的報錯
<!-- web --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> <!--去掉SpringBoot默認(rèn)配置--> <exclusions> <!--過濾系統(tǒng)默認(rèn)的logback日志--> <exclusion> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-logging</artifactId> </exclusion> </exclusions> </dependency> <!-- Log4j2 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-log4j2</artifactId> </dependency>
2. 配置 log4j2.xml
在 resources 下新建 log4j2.xml 文件并寫入以下內(nèi)容:
<?xml version="1.0" encoding="UTF-8"?> <!--Configuration后面的status,這個用于設(shè)置log4j2自身內(nèi)部的信息輸出,可以不設(shè)置,當(dāng)設(shè)置成trace時,你會看到log4j2內(nèi)部各種詳細(xì)輸出--> <!--monitorInterval: Log4j能夠自動檢測修改配置 文件和重新配置本身,設(shè)置間隔秒數(shù)--> <configuration monitorInterval="5"> <!--日志級別以及優(yōu)先級排序: OFF > FATAL > ERROR > WARN > INFO > DEBUG > TRACE > ALL --> <!-- 自己設(shè)置屬性,后面通過${}來訪問 --> <properties> <!--日志存放目錄--> <property name="LOG_HOME">log4j2-logs</property> <!--日志名稱--> <property name="LOG_NAME">patrick-blog-server</property> <!--日志格式-文件--> <property name="LOG_FORMAT">[%d{yyyy-MM-dd HH:mm:ss.SSS}] %p %t %c[%L] - %m %n</property> <!--日志格式-控制臺--> <property name="LOG_FORMAT_CONSOLE">%d{yyyy-MM-dd HH:mm:ss.SSS} %highlight{%-5level} [%t] %highlight{%c{1.}.%M(%L)}: %msg%n%throwable</property> <!--備份目錄- 根據(jù)年月建立文件夾 --> <property name="BACKUP_HOME">${LOG_HOME}/$${date:yyyy-MM}</property> <!--備份頻率--> <property name="BACK_HZ">%d{yyyy-MM-dd}</property> </properties> <appenders> <!--控制臺日志--> <console name="console" target="SYSTEM_OUT"> <!--輸出日志的格式--> <PatternLayout pattern="${LOG_FORMAT_CONSOLE}" disableAnsi="false" noConsoleNoAnsi="false"/> <!--控制臺只輸出level及其以上級別的信息(onMatch),其他的直接拒絕(onMismatch)--> <ThresholdFilter level="info" onMatch="ACCEPT" onMismatch="DENY"/> </console> <!--文件會打印出所有信息,這個log每次運行程序會自動清空,由append屬性決定,適合臨時測試用--> <File name="filelog" fileName="${LOG_HOME}/${LOG_NAME}/test.log" append="false"> <PatternLayout pattern="${LOG_FORMAT}"/> </File> <!-- 這個會打印出所有的info及以下級別的信息,每次大小超過size,則這size大小的日志會自動存入按年份-月份建立的文件夾下面并進行壓縮,作為存檔--> <RollingFile name="infoLog" fileName="${LOG_HOME}/${LOG_NAME}/info.log" filePattern="${LOG_HOME}/${LOG_NAME}-INFO-%d{yyyy-MM-dd}_%i.log.gz"> <!--控制臺只輸出level及以上級別的信息(onMatch),其他的直接拒絕(onMismatch)--> <ThresholdFilter level="info" onMatch="ACCEPT" onMismatch="DENY"/> <PatternLayout pattern="${LOG_FORMAT}"/> <Policies> <!--interval屬性用來指定多久滾動一次,默認(rèn)是1 hour--> <TimeBasedTriggeringPolicy interval="1"/> <SizeBasedTriggeringPolicy size="10MB"/> </Policies> <!-- DefaultRolloverStrategy屬性如不設(shè)置,則默認(rèn)為最多同一文件夾下7個文件開始覆蓋--> <DefaultRolloverStrategy max="15"/> </RollingFile> <!-- 這個會打印出所有的warn及以下級別的信息,每次大小超過size,則這size大小的日志會自動存入按年份-月份建立的文件夾下面并進行壓縮,作為存檔--> <RollingFile name="warnLog" fileName="${LOG_HOME}/${LOG_NAME}/warn.log" filePattern="${LOG_HOME}/${LOG_NAME}-WARN-%d{yyyy-MM-dd}_%i.log.gz"> <!--控制臺只輸出level及以上級別的信息(onMatch),其他的直接拒絕(onMismatch)--> <ThresholdFilter level="warn" onMatch="ACCEPT" onMismatch="DENY"/> <PatternLayout pattern="${LOG_FORMAT}"/> <Policies> <!--interval屬性用來指定多久滾動一次,默認(rèn)是1 hour--> <TimeBasedTriggeringPolicy interval="1"/> <SizeBasedTriggeringPolicy size="10MB"/> </Policies> <!-- DefaultRolloverStrategy屬性如不設(shè)置,則默認(rèn)為最多同一文件夾下7個文件開始覆蓋--> <DefaultRolloverStrategy max="15"/> </RollingFile> <!-- 這個會打印出所有的error及以下級別的信息,每次大小超過size,則這size大小的日志會自動存入按年份-月份建立的文件夾下面并進行壓縮,作為存檔--> <RollingFile name="errorLog" fileName="${LOG_HOME}/${LOG_NAME}/error.log" filePattern="${LOG_HOME}/${LOG_NAME}-ERROR-%d{yyyy-MM-dd}_%i.log.gz"> <!--控制臺只輸出level及以上級別的信息(onMatch),其他的直接拒絕(onMismatch)--> <ThresholdFilter level="error" onMatch="ACCEPT" onMismatch="DENY"/> <PatternLayout pattern="${LOG_FORMAT}"/> <Policies> <!--interval屬性用來指定多久滾動一次,默認(rèn)是1 hour--> <TimeBasedTriggeringPolicy interval="1"/> <SizeBasedTriggeringPolicy size="10MB"/> </Policies> <!-- DefaultRolloverStrategy屬性如不設(shè)置,則默認(rèn)為最多同一文件夾下7個文件開始覆蓋--> <DefaultRolloverStrategy max="15"/> </RollingFile> </appenders> <!--Logger節(jié)點用來單獨指定日志的形式,比如要為指定包下的class指定不同的日志級別等。--> <!--然后定義loggers,只有定義了logger并引入的appender,appender才會生效--> <loggers> <!--過濾掉spring和mybatis的一些無用的DEBUG信息--> <logger name="org.mybatis" level="info" additivity="false"> <AppenderRef ref="console"/> </logger> <!--監(jiān)控系統(tǒng)信息--> <!--若是additivity設(shè)為false,則子Logger 只會在自己的appender里輸出,而不會在父Logger 的appender里輸出。--> <Logger name="org.springframework" level="info" additivity="false"> <AppenderRef ref="console"/> </Logger> <root level="info"> <!-- 輸出到控制臺 --> <appender-ref ref="console"/> <!-- 輸出到文件 --> <appender-ref ref="filelog"/> <appender-ref ref="infoLog"/> <appender-ref ref="warnLog"/> <appender-ref ref="errorLog"/> </root> </loggers> </configuration>
3. 使用 lombok 工具簡化創(chuàng)建 Logger 類
使用 lombok 可以省略構(gòu)建 logger 實例的過程,用 @Slf4j 注解簡化開發(fā)
@Slf4j public class LogTest { public static void main(String... args) { log.error("Something is warning here"); } }
總結(jié)
到此這篇關(guān)于Spring Boot整合log4j2日志配置的文章就介紹到這了,更多相關(guān)SpringBoot整合log4j2日志配置內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java集合中獲取數(shù)據(jù)前驅(qū)和后繼元素的實現(xiàn)
使用一致性hash時,如何找到一個hash值對應(yīng)的臨近節(jié)點,可以使用集合中獲取數(shù)據(jù)的前驅(qū)和后繼元素實現(xiàn),所以本文給大家介紹了Java集合中獲取數(shù)據(jù)前驅(qū)和后繼元素的實現(xiàn),文中有相關(guān)的代碼示例供大家參考,需要的朋友可以參考下2024-05-05SpringBoot中的@RequestMapping注解的用法示例
@RequestMapping注解是SpringBoot中最常用的注解之一,它可以幫助開發(fā)者定義和處理HTTP請求,本篇文章我們將詳細(xì)為大家介紹如何使用SpringBoot中的@RequestMapping注解,感興趣的同學(xué)跟著小編一起來學(xué)習(xí)吧2023-06-06java正則匹配HTML中a標(biāo)簽里的中文字符示例
這篇文章主要介紹了java正則匹配HTML中a標(biāo)簽里的中文字符,涉及java中文正則及HTML元素操作技巧,具有一定參考借鑒價值,需要的朋友可以參考下2017-01-01