springboot日志使用入門(mén)
★ 典型的Spring Boot日志依賴(lài):
spring-boot-start.jar
-- spring-boot-starter-logging.jar (Spring Boot的日志包)
-- logback(core、classic)
-- log4j-to-slf4j.jar
-- jul-to-slf4j.jar
就是springboot的默認(rèn)的日志依賴(lài)實(shí)現(xiàn)。創(chuàng)建項(xiàng)目的時(shí)候存在這個(gè)依賴(lài)?yán)锩妗?
★ Java領(lǐng)域的日志框架可分為:
▲ 門(mén)面類(lèi)(抽象層):SLF4J、JCL(Apache commons logging)、JBoss Logging
▲ 日志實(shí)現(xiàn):Log4j、Log4j2、Logback、JUL(JDK內(nèi)置的java.util.logging)
推薦應(yīng)用程序面向日志門(mén)面編程,以便底層可以在不同的日志實(shí)現(xiàn)之間自由切換。
項(xiàng)目中的日志框架,通常是兩個(gè):日志門(mén)面(抽象)+ 日志實(shí)現(xiàn)
★ Spring Boot的日志設(shè)計(jì)
下面的日志實(shí)現(xiàn)就是基于 SLF4J+Logback
SLF4J+Logback:SLF4J是門(mén)面,Logback是實(shí)現(xiàn)
▲ Spring Boot日志采用如下組合:
- SLF4J+Logback:SLF4J是門(mén)面,Logback是實(shí)現(xiàn)
▲ 由于Spring Boot要整合大量其他框架,這些框架底層可能采用了各種不同的日志實(shí)現(xiàn),
因此Spring Boot需要將這些日志全部“路由”給SLF4J(把所有日志統(tǒng)一交給SLF4J來(lái)輸出),
以后開(kāi)發(fā)者就只需要設(shè)置SLF4J的日志即可。
因此還需要
- log4j-to-slf4j.jar:它負(fù)責(zé)將Log4j日志路由到SLF4J。
- jul-to-slf4j.jar:負(fù)責(zé)將JUL日志路由到SLF4J。
【說(shuō)明】:當(dāng)你項(xiàng)目用了Spring Boot之后,Spring boot會(huì)負(fù)責(zé)將所有第三方框架日志都路由給SLF4J,
開(kāi)發(fā)者就只需要配置SLF4J日志,即可對(duì)所有的日志進(jìn)行全盤(pán)控制。
【注意】:將Spring Boot應(yīng)用部署到服務(wù)器上,JUL生成的日志將不再路由到Spring Boot應(yīng)用的日志。
——由于應(yīng)用服務(wù)器底層往往都使用JUL日志,由于應(yīng)用服務(wù)器本身、及服務(wù)器上可能部署了其他應(yīng)用的日志
這些日志當(dāng)然與我們Spring Boot應(yīng)用無(wú)關(guān),所以Spring Boot默認(rèn)不會(huì)將這些日志路由到SLF4J上。
【總結(jié)】 Spring Boot統(tǒng)一了Java領(lǐng)域的所有框架所可能用到的日志實(shí)現(xiàn),并將這些日志全部“路由”給SLF4J來(lái)管理,
因此開(kāi)發(fā)者只要管理SLF4J日志,即可對(duì)項(xiàng)目中所有日志框架進(jìn)行管理。
★ 使用日志:
(1)在程序中獲取Logger對(duì)象(org.slf4j包下的),通過(guò)LoggerFactory。
也可用Lombok的@Slf4j注解來(lái)獲取。
(2)在要輸出日志的地方(相當(dāng)于以前Systme.out.println)
Logger的trace\debug\info\warn\error來(lái)輸出不同級(jí)別的日志。
★ 日志級(jí)別
▲ 日志級(jí)別:
TRACE < DEBUG < INFO < WARNING < ERROR
▲ 當(dāng)日志輸出方法的級(jí)別高于或等于應(yīng)用日志的設(shè)置級(jí)別時(shí),該日志才會(huì)實(shí)際輸出。
Spring Boot應(yīng)用默認(rèn)的日志級(jí)別是INFO,因此它默認(rèn)只輸出info、warn、error方法輸出的日志。
★ 設(shè)置日志級(jí)別:
設(shè)置日志的級(jí)別,可通過(guò)以下方式:
▲ 改變Spring Boot的核心日志級(jí)別
通過(guò)debug=true或trace=true等屬性(通過(guò)配置文件、命令行參數(shù)、系統(tǒng)變量、OS環(huán)境變量等方式)
改變整個(gè)Spring Boot核心的日志級(jí)別。
▲ 改變程序組件(包括所有各種框架)的核心日志級(jí)別
通過(guò)logging.level.<logger-name>=<level>屬性(可通過(guò)配置文件、命令行參數(shù)、系統(tǒng)變量等方式)設(shè)置指定日志的日志級(jí)別。
其中<logger-name>代表日志名,通常就是包名或全限定的類(lèi)名,
如果<logger-name>使用包名,那就意味著對(duì)該包下所有類(lèi)統(tǒng)一設(shè)置日志級(jí)別。
如果<logger-name>使用類(lèi)名,那就意味著對(duì)該類(lèi)設(shè)置日志級(jí)別。
而level則可以是trace、debug、info、warn和error等級(jí)別。
【小技巧】實(shí)際項(xiàng)目開(kāi)發(fā)時(shí),盡量避免使用System.out.println來(lái)做輸出,而應(yīng)該用日志來(lái)做輸出。
System.out.println 在輸出的時(shí)候,每打印一行都是需要進(jìn)行IO的,所以會(huì)很耗性能。
如果你在調(diào)試時(shí)用了大量的System.out.println來(lái)做輸出,到了項(xiàng)目上線(xiàn)時(shí)必須要?jiǎng)h除這些輸出語(yǔ)法,否則會(huì)因?yàn)镮O造成性能影響。
但如果你用的日志(debug)來(lái)輸出,項(xiàng)目上線(xiàn)時(shí),只要將應(yīng)用級(jí)別調(diào)高,這些日志輸出就會(huì)被自動(dòng)關(guān)閉,因此無(wú)需輸出這些日志輸出語(yǔ)句。
▲ 互聯(lián)網(wǎng)上常問(wèn)如何控制日志輸出
Spring Boot讓MyBatis輸出它執(zhí)行的SQL語(yǔ)句?。糠浅:?jiǎn)單:
logging.level.<Mapper組件所在包>=debug
組件可以理解是類(lèi)
Spring Boot看到Redis的詳細(xì)執(zhí)行過(guò)程?非常簡(jiǎn)單:
logging.level.io.lettuce.core=debug
Spring Boot整合Redis默認(rèn)使用Lettuce依賴(lài),而io.lettuce.core就是Lettuce組件核心API所在的包。
Spring Boot看到MongoDB的詳細(xì)執(zhí)行過(guò)程?非常簡(jiǎn)單:
logging.level.com.mongodb=debug
上面com.mongodb就是MongoDB核心API所在的包。
由此可見(jiàn),通過(guò)Spring Boot可以讓它輸出任意框架的執(zhí)行過(guò)程,只需要如下設(shè)置
logging.leve.<框架核心API所在的包>=debug
代碼示例:
1、先創(chuàng)建一個(gè)類(lèi),獲取日志對(duì)象。
2、然后在application.yml配置類(lèi)里面配置一些日志信息—改變Spring Boot的核心日志級(jí)別
通過(guò)debug=true或trace=true等屬性(通過(guò)配置文件、命令行參數(shù)、系統(tǒng)變量、OS環(huán)境變量等方式)改變整個(gè)Spring Boot核心的日志級(jí)別。
如圖:這里在配置文件里面設(shè)置核心日志級(jí)別為 trace = true,就是級(jí)別為 trace。
但是打印出來(lái)的還是只有 info、warn 和error,但是控制臺(tái)的啟動(dòng)記錄里面還是有trace的,如圖
這個(gè)是改變項(xiàng)目程序組件的核心日志級(jí)別,設(shè)置特定包下所有類(lèi)的日志級(jí)別,打印的時(shí)候就可以如圖,把 trace 和 debug 都打印出來(lái)
這個(gè)是讓controller包下面的所有類(lèi)的日志級(jí)別設(shè)置為 trace
這個(gè)是讓LogController這個(gè)類(lèi)的日志級(jí)別設(shè)置為 trace
★ 日志輸出到文件:
Spring Boot默認(rèn)只將日志輸出到控制臺(tái),不輸出到文件,如果要將日志輸出到文件,
可為Spring Boot設(shè)置如下兩個(gè)屬性的其中之一:
- logging.file.name:設(shè)置日志文件的文件名。
- logging.file.path:設(shè)置日志文件的目錄。使用默認(rèn)的spring.log作為文件名。
logging.file.path 這個(gè)有一個(gè)好處,就是當(dāng)日志文件過(guò)大的時(shí)候,就會(huì)自動(dòng)把日志文件分成多個(gè)文件。
代碼示例:
- logging.file.path:設(shè)置日志文件的目錄。使用默認(rèn)的spring.log作為文件名。
這個(gè)就是生成在文件夾中的日志文件,跟控制臺(tái)的打印出來(lái)的是一樣的。
Logback設(shè)置
logging.logback.rollingpolicy.file-name-pattern: 設(shè)置對(duì)日志歸檔的文件名模板
logging.logback.rollingpolicy.clean-history-on-start:設(shè)置應(yīng)用啟動(dòng)時(shí)是否清除日志歸檔
logging.logback.rollingpolicy.max-file-size日志文件歸檔之前的最大大小
logging.logback.rollingpolicy.total-size-cap:日志歸檔在被刪除之前所能容納的最大大小
logging.logback.rollingpolicy.max-history: 保留多少天的日志歸檔(默認(rèn)為7)
Java 的日志歸檔是指對(duì)生成的日志文件進(jìn)行周期性或大小限制的管理,以便保留和存檔舊的日志文件,以便后續(xù)的檢查、分析和備份。
通常情況下,應(yīng)用程序會(huì)生成大量的日志數(shù)據(jù),這些日志文件會(huì)越來(lái)越大,占用系統(tǒng)存儲(chǔ)空間。為了避免過(guò)多的日志文件影響系統(tǒng)性能和存儲(chǔ)空間的占用,可以對(duì)日志進(jìn)行歸檔管理。
具體來(lái)說(shuō),歸檔通常有以下幾種方式:
基于時(shí)間的歸檔:按照一定的時(shí)間間隔(如每天、每周、每月)將日志文件進(jìn)行歸檔,將舊的日志文件存檔到特定的文件夾或壓縮文件中,以便后續(xù)查閱。
基于大小的歸檔:當(dāng)日志文件達(dá)到一定大小時(shí),將當(dāng)前的日志文件存檔,然后重新創(chuàng)建一個(gè)新的日志文件,以確保日志文件的大小始終在一個(gè)可接受的范圍內(nèi)。
★ 日志組:
(1)將多個(gè)包定義一個(gè)組名,
(2)然后對(duì)整個(gè)組設(shè)置指定的日志級(jí)別
——這樣即可將該組對(duì)應(yīng)的所有包統(tǒng)一設(shè)置成相同的日志級(jí)別。
日志組也是一個(gè)提高項(xiàng)目可維護(hù)性的小技巧。
就是一個(gè)項(xiàng)目有很多個(gè)包(文件夾),比如 controller,service、dao、domain、config 等等,然后我們想讓controller、service、dao這三個(gè)包的日志級(jí)別設(shè)置為 debug 級(jí)別。但是又不可能在配置文件中一個(gè)包一個(gè)包的寫(xiě)配置,所以這個(gè)時(shí)候就可以用到日志組。
代碼示例:
需求:我這個(gè)項(xiàng)目有三個(gè)包c(diǎn)1,c2,c3,我想讓 c2 和 c3 這兩個(gè)包的日志級(jí)別為 warn ,然后項(xiàng)目的其他包的日志級(jí)別為trace。
這里建3個(gè)包
我配置讓 c2 c3這兩個(gè)包的日志級(jí)別為warn
項(xiàng)目其他包的日志級(jí)別為 trace,其他包不可能一個(gè)一個(gè)寫(xiě)出來(lái),所以直接把最大的包 boot 進(jìn)行設(shè)置。
但是 c2 c3 這兩個(gè)包又被包含在 boot 包里面,所以要看看c2 c3 這兩個(gè)包的日志級(jí)別是我們要的 warn 級(jí)別,還是會(huì)因?yàn)楸籦oot包 包含而變成trace級(jí)別
如圖可以看出 c2 c3 這兩個(gè)包的日志級(jí)別沒(méi)有被 boot 包影響,還是我們要的warn級(jí)別。
而項(xiàng)目的其他包,如 c1 ,就是我們要的 trace 級(jí)別
這兩個(gè)設(shè)置,誰(shuí)放上面誰(shuí)放下面都沒(méi)有影響各自的日志級(jí)別,不會(huì)有那種放下面然后覆蓋上面的情況。
上面的日志實(shí)現(xiàn)就是基于 SLF4J + Logback:SLF4J是門(mén)面,Logback是實(shí)現(xiàn)
▲ 門(mén)面類(lèi)(抽象層):SLF4J、JCL(Apache commons logging)、JBoss Logging
▲ 日志實(shí)現(xiàn):Log4j、Log4j2、Logback、JUL(JDK內(nèi)置的java.util.logging)
★ 如何替換默認(rèn)的日志實(shí)現(xiàn)(Logback)
▲ 兩步:
(1)去掉Logback依賴(lài)庫(kù),添加新日志實(shí)現(xiàn)的依賴(lài)庫(kù)。
Logback日志實(shí)現(xiàn)的優(yōu)先級(jí)最高,當(dāng)該日志實(shí)現(xiàn)的JAR存在時(shí),Spring Boot總會(huì)使用該JAR包作為默認(rèn)的日志實(shí)現(xiàn)。
(2)在類(lèi)加載路徑的根路徑下為新日志實(shí)現(xiàn)提供對(duì)應(yīng)的配置文件。
默認(rèn)從類(lèi)加載路徑的根路徑下加載日志配置文件,也可通過(guò)logging.config屬性來(lái)設(shè)置新的加載路徑。
除了可根據(jù)底層依賴(lài)庫(kù)自動(dòng)選擇日志實(shí)現(xiàn)外——根據(jù)JAR包來(lái)自動(dòng)選擇日志實(shí)現(xiàn),找到哪個(gè)日志實(shí)現(xiàn)的JAR包,Spring Boot就是用哪個(gè)日志實(shí)現(xiàn)。
還可通過(guò)org.springframework.boot.logging.LoggingSystem屬性顯式指定日志實(shí)現(xiàn),
該屬性的值可以是LoggingSystem實(shí)現(xiàn)類(lèi)的全限定名。
▲ 不同日志實(shí)現(xiàn)的配置文件:
Logback:logback-spring.xml、logback-spring.groovy、logback.xml或 logback.groovy
Log4j2: log4j2-spring.xml或log4j2.xml
JDK(JUL):logging.properties
Spring Boot 推薦 使用帶-spring后綴的配置文件作為對(duì)應(yīng)日志框架的配置文件。
★ 控制日志只輸出到文件(不輸出到控制臺(tái))
項(xiàng)目上線(xiàn)時(shí)比較實(shí)用!
兩步:
(1)控制日志輸出到文件。
指定logging.file.name或logging.file.path兩個(gè)屬性的其中之一。
(2)還需要顯式提供日志實(shí)現(xiàn)對(duì)應(yīng)的配置文件,通過(guò)該配置文件關(guān)閉日志在控制臺(tái)的輸出。
——這一步的配置文件往往應(yīng)該是日志實(shí)現(xiàn)相關(guān)的,和Spring Boot關(guān)系并不大。
代碼示例
1、創(chuàng)建一個(gè) logback-spring.xml 配置文件,這個(gè)配置文件專(zhuān)門(mén)用來(lái)控制 logback 日志的,現(xiàn)在在這個(gè)配置文件進(jìn)行配置,讓日志不要輸出到控制臺(tái),只輸出到指定的文件就行
application.yml 的配置不需要改,還是那樣。
啟動(dòng)項(xiàng)目,然后再訪(fǎng)問(wèn)方法,發(fā)現(xiàn)控制臺(tái)都沒(méi)有任何的日志輸出,一片空白,然后打開(kāi)日志輸出的文件,發(fā)現(xiàn)成功只輸出在文件中
如圖:項(xiàng)目的啟動(dòng)時(shí)間是16:36分,文件中的日志也是同個(gè)時(shí)間,證明日志只輸出在指定文件中,沒(méi)有輸出在控制臺(tái)
logback-spring.xml配置文件
<!-- 關(guān)閉LogBack的日志在控制器的輸出 -->
<configuration>
<!-- 導(dǎo)入Logback通用的日志配置 -->
<include resource="org/springframework/boot/logging/logback/defaults.xml"/>
<!-- 定義日志文件 -->
<property name="LOG_FILE" value="${LOG_FILE:-${LOG_PATH:-${LOG_TEMP:-${java.io.tmpdir:-/tmp}}/}spring.log}"/>
<!-- 導(dǎo)入輸入到文件的日志配置 -->
<include resource="org/springframework/boot/logging/logback/file-appender.xml"/>
<!-- 指定將日志輸出到文件 ,只輸出到文件,不輸出到控制臺(tái) -->
<root level="INFO">
<appender-ref ref="FILE"/>
</root>
</configuration>
上面用的是默認(rèn)的 Logback,現(xiàn)在要改成 log4j2
★ 通過(guò)例子示范使用log4j2替換Logback
——比較小眾的應(yīng)用場(chǎng)景。用的比較少,因?yàn)?springboot 推薦用 SLF4J+Logback ,所以沒(méi)必要改成其他的
但是這里可以嘗試一下。
(1)去掉去掉Logback依賴(lài)庫(kù),添加Log4j2日志實(shí)現(xiàn)的依賴(lài)庫(kù)。
(2)添加log4j2日志的配置文件——這一步是可選的。
代碼示例
在創(chuàng)建項(xiàng)目的時(shí)候,就會(huì)默認(rèn)有l(wèi)ogback的日志依賴(lài)了,所以把這個(gè)logback的日志依賴(lài)從pom.xml文件中去除就可以了。
1、這個(gè)操作就是把springboot默認(rèn)的日志排除在外(就是把logback排除在外)
2、添加新的日志實(shí)現(xiàn)
啟動(dòng)項(xiàng)目,發(fā)現(xiàn)日志輸出和之前沒(méi)有什么區(qū)別,因?yàn)楦娜罩緦?shí)現(xiàn),是底層實(shí)現(xiàn)的,不是具體的代碼實(shí)現(xiàn),可以理解為抽象的,所以用 logback 或者是 log4j2 ,只是底層實(shí)現(xiàn)方法變了,但是呈現(xiàn)出來(lái)的效果還是一樣的。
如果:因?yàn)榘裭ogback 改成 log4j2 ,所以原本設(shè)置的 日志記錄只輸出到文件,不輸出到控制臺(tái)的作用,也失效了。
要看logback 和 log4j2 的區(qū)別,只能從maven 里面看了
改回來(lái) logback ,原本設(shè)置的 日志記錄只輸出到文件,不輸出到控制臺(tái)的效果 就又恢復(fù)了
另一種日志打印方式:
在類(lèi)上面添加注解 @Slf4j,那么就會(huì)有一個(gè) log 對(duì)象,直接用 log.info 來(lái)打印日志就可以了。文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-772982.html
@SpringBootApplication
@Slf4j
public class App {
public static void main(String[] args) {
var ctx = SpringApplication.run(App.class, args);
//普通控制臺(tái)打印
System.err.println("普通打印myConfig01:"+ctx.getBean("myConfig01"));
//@Slf4j 日志打印,輸出info級(jí)別的日志,日志只能輸出字符串
//直接拿配置類(lèi)這個(gè)bean,類(lèi)名要小寫(xiě)
log.info("日志打印myConfig01:"+ctx.getBean("myConfig01"));
log.info("日志打印dataFormat:"+ctx.getBean("getDataFormat"));
}
普通控制臺(tái)打印和日志打印效果文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-772982.html
到了這里,關(guān)于23、springboot日志使用入門(mén)-- SLF4J+Logback 實(shí)現(xiàn)(springboot默認(rèn)的日志實(shí)現(xiàn)),日志打印到控制臺(tái)及日志輸出到指定文件的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!