Spring?Boot整合log4j2日志配置的詳細(xì)教程
前言
在項(xiàng)目推進(jìn)中,如果說(shuō)第一件事是搭建 Spring 框架的話,那么第二件事情就是在 Sring 基礎(chǔ)上搭建日志框架,此篇文章是博主在學(xué)習(xí)過(guò)程中使用 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è)升級(jí)版本了,它從頭到尾都被重寫了
二、配置參數(shù)介紹
1. 日志級(jí)別
共有8個(gè)級(jí)別,按照從低到高為:All < Trace < Debug < Info < Warn < Error < Fatal < OFF
機(jī)制:如果一條日志信息的級(jí)別大于等于配置文件的級(jí)別,就記錄
- All:最低等級(jí)的,用于打開所有日志記錄
- Trace:追蹤,就是程序推進(jìn)一下,可以寫個(gè) trace 輸出
- Debug:調(diào)試,指出細(xì)粒度信息事件,對(duì)調(diào)試應(yīng)用程序是非常有幫助的
- Info:消息在粗粒度級(jí)別上突出強(qiáng)調(diào)應(yīng)用程序的運(yùn)行過(guò)程
- Warn:輸出警告及 warn 以下級(jí)別的日志,有些信息不是錯(cuò)誤信息,但也要給程序員一些提示
- Error:輸出錯(cuò)誤信息日志
- Fatal:輸出每個(gè)嚴(yán)重的錯(cuò)誤,將會(huì)導(dǎo)致應(yīng)用程序的退出的日志
- OFF:最高等級(jí),用于關(guān)閉所有日志記錄
2. 輸出形式
- CONSOLE(輸出到控制臺(tái))
- FILE(輸出到文件)
3. 日志格式
- SimpleLayout:以簡(jiǎn)單的形式顯示
- 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: 輸出日志級(jí)別,-5表示左對(duì)齊并且固定輸出5個(gè)字符,如果不足在右邊補(bǔ)0
%p: 日志輸出格式
%c: logger的名稱(%logger)
%m : 日志內(nèi)容, 即 logger.info("message")
%n: 換行符
%C: Java類名(%F)
%L: 日志輸出所在行數(shù)
%M: 日志輸出所在方法名
%l: 輸出語(yǔ)句所在的行數(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:用來(lái)指定 log4j 本身的打印日志的級(jí)別
- monitorinterval:用來(lái)指定 log4j 自動(dòng)重新配置的監(jiān)測(cè)間隔時(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),用來(lái)定義輸出到控制臺(tái)的 Appender
屬性:
- name:用來(lái)指定 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),用來(lái)定義輸出到指定位置的文件的 Appender,一般用來(lái)測(cè)試輸出
屬性:
- name:用來(lái)指定 Appender 的名字
- fileName:指定輸出日志的目的文件帶全路徑的文件名
子節(jié)點(diǎn):
- PatternLayout:輸出格式,默認(rèn)值:%m%n
- ThresholdFilter:指定輸出級(jí)別
2.3 RollingFile 節(jié)點(diǎn)
Appenders 節(jié)點(diǎn)的子節(jié)點(diǎn),用來(lái)定義超過(guò)指定大小,自動(dòng)刪除舊的創(chuàng)建新的 Appender
屬性:
- name:用來(lái)指定 Appender 的名稱
- fileName:指定輸出日志的目的文件帶全路徑的文件名
- filePattern:指定新建日志文件的名稱格式
子節(jié)點(diǎn):
- ThresholdFilter:決定日志事件能否被輸出
- PatternLayout:輸出格式,默認(rèn)值:%m%n
- Policies:指定滾動(dòng)日志的策略,就是什么時(shí)候進(jìn)行新建日志文件輸出日志
- DefaultRolloverStrategy:用來(lái)指定同一個(gè)文件夾下最多有幾個(gè)日志文件時(shí),開始刪除最舊的,創(chuàng)建新的日志文件(通過(guò) max 屬性)
2.3.1 ThresholdFilter 節(jié)點(diǎn)
RollingFile 節(jié)點(diǎn)的子節(jié)點(diǎn),決定日志事件能否被輸出。過(guò)濾條件有三個(gè)值:ACCEPT (接受),DENY (拒絕) or NEUTRAL (中立)
屬性:
- level:指定過(guò)濾日志的級(jí)別
- 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 屬性用來(lái)指定多久滾動(dòng)一次,默認(rèn)是 1hour。modulate = true 用來(lái)調(diào)整時(shí)間
- SizeBasedTriggeringPolicy:基于指定文件大小的滾動(dòng)策略,size 屬性用來(lái)定義每個(gè)日志文件的大小
2.3.3 ThresholdFilter 節(jié)點(diǎn)
3. Loggers 節(jié)點(diǎn)
Configuration 根節(jié)點(diǎn)的子節(jié)點(diǎn)
子節(jié)點(diǎn):
- Root:用來(lái)指定項(xiàng)目的根日志,如果沒有單獨(dú)指定 Logger,那么就會(huì)默認(rèn)使用該 Root 日志輸出
- Logger:用來(lái)單獨(dú)指定日志的形式,比如要為指定包下的 class 指定不同的日志級(jí)別等
3.1 Root 節(jié)點(diǎn)
Loggers 節(jié)點(diǎn)的子節(jié)點(diǎn)
屬性:
- level:指定日志輸出級(jí)別
子節(jié)點(diǎn):
- appender-ref:用來(lái)指定該日志輸出到哪個(gè) Appender,通過(guò) ref 指定
3.2 Logger 節(jié)點(diǎn)
屬性:
- level:指定日志輸出級(jí)別
- name:用來(lái)指定該 Logger 所適用的類或者類所在的包全路徑,繼承自 Root 節(jié)點(diǎn)
子節(jié)點(diǎn):
- appender-ref:用來(lái)指定該日志輸出到哪個(gè)Appender,通過(guò) 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>
<!--過(guò)濾系統(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)檢測(cè)修改配置 文件和重新配置本身,設(shè)置間隔秒數(shù)-->
<configuration monitorInterval="5">
<!--日志級(jí)別以及優(yōu)先級(jí)排序: OFF > FATAL > ERROR > WARN > INFO > DEBUG > TRACE > ALL -->
<!-- 自己設(shè)置屬性,后面通過(guò)${}來(lái)訪問(wèn) -->
<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及其以上級(jí)別的信息(onMatch),其他的直接拒絕(onMismatch)-->
<ThresholdFilter level="info" onMatch="ACCEPT" onMismatch="DENY"/>
</console>
<!--文件會(huì)打印出所有信息,這個(gè)log每次運(yùn)行程序會(huì)自動(dòng)清空,由append屬性決定,適合臨時(shí)測(cè)試用-->
<File name="filelog" fileName="${LOG_HOME}/${LOG_NAME}/test.log" append="false">
<PatternLayout pattern="${LOG_FORMAT}"/>
</File>
<!-- 這個(gè)會(huì)打印出所有的info及以下級(jí)別的信息,每次大小超過(guò)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及以上級(jí)別的信息(onMatch),其他的直接拒絕(onMismatch)-->
<ThresholdFilter level="info" onMatch="ACCEPT" onMismatch="DENY"/>
<PatternLayout pattern="${LOG_FORMAT}"/>
<Policies>
<!--interval屬性用來(lái)指定多久滾動(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及以下級(jí)別的信息,每次大小超過(guò)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及以上級(jí)別的信息(onMatch),其他的直接拒絕(onMismatch)-->
<ThresholdFilter level="warn" onMatch="ACCEPT" onMismatch="DENY"/>
<PatternLayout pattern="${LOG_FORMAT}"/>
<Policies>
<!--interval屬性用來(lái)指定多久滾動(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及以下級(jí)別的信息,每次大小超過(guò)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及以上級(jí)別的信息(onMatch),其他的直接拒絕(onMismatch)-->
<ThresholdFilter level="error" onMatch="ACCEPT" onMismatch="DENY"/>
<PatternLayout pattern="${LOG_FORMAT}"/>
<Policies>
<!--interval屬性用來(lái)指定多久滾動(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)用來(lái)單獨(dú)指定日志的形式,比如要為指定包下的class指定不同的日志級(jí)別等。-->
<!--然后定義loggers,只有定義了logger并引入的appender,appender才會(huì)生效-->
<loggers>
<!--過(guò)濾掉spring和mybatis的一些無(wú)用的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 工具簡(jiǎn)化創(chuàng)建 Logger 類
使用 lombok 可以省略構(gòu)建 logger 實(shí)例的過(guò)程,用 @Slf4j 注解簡(jiǎn)化開發(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)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- Spring Boot 日志級(jí)別及配置詳解
- springboot中l(wèi)ogback日志配置的詳細(xì)說(shuō)明
- 一文帶你搞定SpringBoot Log4j2日志配置文件
- SpringBoot日志配置SLF4J和Logback的方法實(shí)現(xiàn)
- SpringBoot日志配置全過(guò)程
- Spring?Boot日志打印配置詳細(xì)介紹
- Springboot日志配置的實(shí)現(xiàn)示例
- SpringBoot3配置Logback日志滾動(dòng)文件的方法
- 如何為?Spring?Boot?項(xiàng)目配置?Logback?日志
- Spring Boot配置日志的實(shí)現(xiàn)步驟
相關(guān)文章
詳解使用JRebel插件實(shí)現(xiàn)SpringBoot應(yīng)用代碼熱加載
這篇文章主要介紹了詳解使用JRebel插件實(shí)現(xiàn)SpringBoot應(yīng)用代碼熱加載,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-10-10
在Java中實(shí)現(xiàn)線程安全的單例模式的常見方式
單例模式是一種常用的軟件設(shè)計(jì)模式,它確保一個(gè)類只有一個(gè)實(shí)例,并提供一個(gè)全局訪問(wèn)點(diǎn),在多線程環(huán)境下,確保單例模式的線程安全性是非常重要的,因?yàn)槎鄠€(gè)線程可能會(huì)同時(shí)嘗試創(chuàng)建實(shí)例,導(dǎo)致實(shí)例不唯一的問(wèn)題,本文介紹了在Java中實(shí)現(xiàn)線程安全的單例模式有幾種常見的方式2024-09-09
base64_encode和base64_decode的JAVA實(shí)現(xiàn)
Base64 編碼其實(shí)是將3個(gè)8位字節(jié)轉(zhuǎn)換為4個(gè)6位這4個(gè)六位字節(jié) 其實(shí)仍然是8位,只不過(guò)高兩位被設(shè)置為0. 當(dāng)一個(gè)字節(jié)只有6位有效時(shí),它的取值空間為0 到 2的6次方減1 即63,也就是說(shuō)被轉(zhuǎn)換的Base64編碼的每一個(gè)編碼的取值空間為(0~63).需要的朋友可以參考下2016-04-04
java實(shí)現(xiàn)順序結(jié)構(gòu)線性列表的函數(shù)代碼
java實(shí)現(xiàn)順序結(jié)構(gòu)線性列表的函數(shù)代碼。需要的朋友可以過(guò)來(lái)參考下,希望對(duì)大家有所幫助2013-10-10
SpringBoot RestTemplate 簡(jiǎn)單包裝解析
這篇文章主要介紹了SpringBoot RestTemplate 簡(jiǎn)單包裝解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-08-08
Java在高并發(fā)場(chǎng)景下實(shí)現(xiàn)點(diǎn)贊計(jì)數(shù)器
點(diǎn)贊計(jì)數(shù)器的本質(zhì)就是對(duì)某個(gè)變量在高并發(fā)情況下的修改,這篇文章主要為大家介紹了Java實(shí)現(xiàn)點(diǎn)贊計(jì)數(shù)器的示例代碼,感興趣的小伙伴可以了解一下2023-06-06
詳解Java中的迭代迭代器Iterator與枚舉器Enumeration
Iterator與Enumeration分別是實(shí)現(xiàn)迭代器和枚舉器類的接口,下面就帶大家來(lái)詳解Java中的迭代迭代器Iterator與枚舉器Enumeration,以及它們之間的區(qū)別.2016-05-05

