SpringBoot?使用log4j2的配置過(guò)程
前言
日志接口(slf4j)
slf4j是對(duì)所有日志框架制定的一種規(guī)范、標(biāo)準(zhǔn)、接口,并不是一個(gè)框架的具體的實(shí)現(xiàn),因?yàn)榻涌诓⒉荒塥?dú)立使用,需要和具體的日志框架實(shí)現(xiàn)配合使用(如log4j、logback)。
接口用于定制規(guī)范,可以有多個(gè)實(shí)現(xiàn),使用時(shí)是面向接口的(導(dǎo)入的包都是slf4j的包而不是具體某個(gè)日志框架中的包),即直接和接口交互,不直接使用實(shí)現(xiàn),所以可以任意的更換實(shí)現(xiàn)而不用更改代碼中的日志相關(guān)代碼。
日志實(shí)現(xiàn)(log4j、logback、log4j2)
Log4j:Apache的一個(gè)開源項(xiàng)目,可以控制日志信息輸送的目的地是控制臺(tái)、文件、GUI組件等,可以控制每一條日志的輸出格式,這些可以通過(guò)一個(gè)配置文件來(lái)靈活地進(jìn)行配置,而不需要修改應(yīng)用的代碼。雖然已經(jīng)停止維護(hù)了,但目前絕大部分企業(yè)都是用的log4j。
LogBack:logback同樣是由log4j的作者設(shè)計(jì)完成的,擁有更好的特性,用來(lái)取代log4j的一個(gè)日志框架,是slf4j的原生實(shí)現(xiàn)。
Log4j2:Log4j2是log4j 1.x和logback的改進(jìn)版,據(jù)說(shuō)采用了一些新技術(shù)(無(wú)鎖異步、等等),使得日志的吞吐量、性能比log4j 1.x提高10倍,并解決了一些死鎖的bug,而且配置更加簡(jiǎn)單靈活。
配置過(guò)程
springboot默認(rèn)是用logback的日志框架的,所以要在pom中配置排除logback。這里需要注意的是,其實(shí)不止一處使用了logback,所以要在starter中統(tǒng)一排除,然后引入log4j2。
涉及的POM部分文件
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
<exclusions>
<exclusion><!-- springboot默認(rèn)是用logback的日志框架的 -->
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-logging</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency> <!-- 引入log4j2依賴 -->
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-log4j2</artifactId>
</dependency>log4j2配置文件,默認(rèn)命名為log4j2.xml。 程序會(huì)會(huì)自動(dòng)加載,如果命名為log4j2-xx.xml。需要在在SpringBoot配置文件application.properties中引入該配置文件,增加一行:logging.config=classpath:log4j2-xx.xml
<?xml version="1.0" encoding="UTF-8" ?>
<Configuration status="WARN" monitorInterval="1800">
<!--變量配置-->
<Properties>
<!--應(yīng)用名稱-->
<property name="APP_NAME">sky-hello</property>
<!--日志存放路徑-->
<property name="LOG_PATH">./logs/${APP_NAME}</property>
<!--日志備份路徑-->
<property name="LOG_BACKUP_PATH">${LOG_PATH}/backup</property>
<!--日志輸出格式-控制臺(tái)-->
<property name="PATTERN_CONSOLE">%d{yyyy-MM-dd HH:mm:ss.SSS} | %blue{%traceId} | %highlight{%-5p} | %magenta{${sys:PID}} | %yellow{%t} | %cyan{%l} : %msg%n</property>
<!--日志輸出格式-文件-->
<property name="PATTERN_FILE">%d{yyyy-MM-dd HH:mm:ss.SSS} | %traceId | %-5p | ${sys:PID} | %t | %l : %msg%n</property>
</Properties>
<!--定義日志輸出目的地,內(nèi)容和格式等-->
<Appenders>
<!--可歸檔文件
1. fileName: 日志存儲(chǔ)路徑
2. filePattern: 歷史日志封存路徑。其中%d{yyyy-MM-dd}表示了日志的時(shí)間單位是天,log4j2自動(dòng)識(shí)別zip等后綴,表示歷史日志需要壓縮
-->
<RollingFile name="RollingFile" fileName="${LOG_PATH}/${APP_NAME}.log" filePattern="${LOG_BACKUP_PATH}/$${date:yyyy-MM}/${APP_NAME}-%d{yyyy-MM-dd}_%i.log.zip">
<!--輸出日志的格式, 不設(shè)置默認(rèn)為:%m%n-->
<PatternLayout pattern="${PATTERN_FILE}"/>
<!--只輸出level及以上級(jí)別的信息(onMatch),其他的直接拒絕(onMismatch)-->
<ThresholdFilter level="DEBUG" onMatch="ACCEPT" onMismatch="DENY"/>
<!--歸檔設(shè)置-->
<Policies>
<!--按時(shí)間間隔歸檔:
1. interval=時(shí)間間隔, 單位由filePattern的%d日期格式指定, 此處配置代表每一天歸檔一次
2. modulate="true" 是否對(duì)interval取模,決定了下一次觸發(fā)的時(shí)間點(diǎn)
-->
<TimeBasedTriggeringPolicy interval="1" modulate="true" />
<!-- 按照日志文件的大小: size表示當(dāng)前日志文件的最大size,支持單位:KB/MB/GB-->
<SizeBasedTriggeringPolicy size="50MB"/>
</Policies>
<!-- 歷史日志配置: 該屬性如不設(shè)置,則默認(rèn)為最多同一文件夾下7個(gè)文件開始覆蓋-->
<DefaultRolloverStrategy max="30"/>
</RollingFile>
<!--錯(cuò)誤信息單獨(dú)歸檔-->
<RollingFile name="RollingFileError" fileName="${LOG_PATH}/${APP_NAME}-error.log" filePattern="${LOG_BACKUP_PATH}/$${date:yyyy-MM}/${APP_NAME}-error-%d{yyyy-MM-dd}_%i.log.zip">
<PatternLayout pattern="${PATTERN_FILE}"/>
<ThresholdFilter level="ERROR" onMatch="ACCEPT" onMismatch="DENY"/>
<Policies>
<TimeBasedTriggeringPolicy/>
<SizeBasedTriggeringPolicy size="50MB"/>
</Policies>
</RollingFile>
</Appenders>
<!--Loggers配置-->
<Loggers>
<!--
注意點(diǎn):
1. logger節(jié)點(diǎn)用來(lái)單獨(dú)指定日志的形式,比如要為指定包下的class指定不同的日志級(jí)別等:
(1). name: 用來(lái)指定該logger所適用的類或者類所在的包全路徑,繼承自Root節(jié)點(diǎn).
(2). AppenderRef:關(guān)聯(lián)的Appender, 只有定義了logger并引入的appender,appender才會(huì)生效
(3). additivity: logEvent的傳遞性。true LogEvent處理后傳遞給父Logger打印。false LogEvent處理后不再向上傳遞給父Logger(解決日志重復(fù)輸出問題)
(4). logger配置的level必須高于或等于Appenders中ThresholdFilter配置的過(guò)濾level, 否則會(huì)造成信息丟失
2. root配置日志的根節(jié)點(diǎn)
-->
<!-- 同步日志配置-->
<logger name="com.sky.hello.mapper" level="debug" additivity="false">
<AppenderRef ref="Console"/>
<AppenderRef ref="RollingFile"/>
<AppenderRef ref="RollingFileError"/>
</logger>
<root level="info">
<AppenderRef ref="Console"/>
<AppenderRef ref="RollingFile"/>
<AppenderRef ref="RollingFileError"/>
</root>
</Loggers>
</Configuration>代碼中使用
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
private final Logger log = LoggerFactory.getLogger(this.getClass());
log.info("info")最后附加 log4j的格式配置參數(shù)
%n - 換行
%m - 日志內(nèi)容,輸出代碼中指定的日志信息
%p - 日志級(jí)別(FATAL, ERROR, WARN, INFO, DEBUG or custom)
%r - 程序啟動(dòng)到現(xiàn)在的毫秒數(shù)
%% - 輸出一個(gè)"%" 字符
%t - 當(dāng)前線程名
%d - 日期和時(shí)間, 常用的格式有 %d{DATE}, %d{ABSOLUTE}, %d{HH:mm:ss,SSS}, %d{ddMMyyyy HH:mm:ss,SSS}
%l - 同 %F%L%C%M
%F - java源文件名
%L - java源碼行數(shù)
%C - java類名,%C{1} 輸出最后一個(gè)元素
%M - java方法名到此這篇關(guān)于SpringBoot 使用log4j2的配置的文章就介紹到這了,更多相關(guān)SpringBoot log4j2配置內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- SpringBoot中配置log4j2日志詳解
- SpringBoot日志框架之Log4j2快速入門與參數(shù)詳解
- SpringBoot整合Log4j2及配置步驟
- SpringBoot?2.x整合Log4j2日志的詳細(xì)步驟
- springboot?log4j2日志框架整合與使用過(guò)程解析
- SpringBoot整合log4j2日志的實(shí)現(xiàn)
- SpringBoot2 集成log4j2日志框架的實(shí)現(xiàn)
- Springboot整合log4j2日志全解總結(jié)
- SpringBoot集成slf4j+log4j2的示例代碼
- SpringBoot配置log4j2的實(shí)現(xiàn)示例
相關(guān)文章
詳談Java中instanceof和isInstance的區(qū)別
下面小編就為大家?guī)?lái)一篇詳談Java中instanceof和isInstance的區(qū)別。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-01-01
詳解 Corba開發(fā)之Java實(shí)現(xiàn)Service與Client
這篇文章主要介紹了詳解 Corba開發(fā)之Java實(shí)現(xiàn)Service與Client的相關(guān)資料,希望通過(guò)本文能幫助到大家,需要的朋友可以參考下2017-10-10
Java使用JavaMail API發(fā)送和接收郵件的代碼示例
JavaMail是Oracle甲骨文開發(fā)的Java郵件類API,支持多種郵件協(xié)議,這里我們就來(lái)看一下Java使用JavaMail API發(fā)送和接收郵件的代碼示例2016-06-06
Java使用JMeter進(jìn)行高并發(fā)測(cè)試
軟件的壓力測(cè)試是一種保證軟件質(zhì)量的行為,本文主要介紹了Java使用JMeter進(jìn)行高并發(fā)測(cè)試,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-11-11
解決因jdk版本引起的TypeNotPresentExceptionProxy異常
這篇文章介紹了解決因jdk版本引起的TypeNotPresentExceptionProxy異常的方法,對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2021-12-12

