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