重學(xué)SpringBoot3之日志Logging使用方式
引言
日志記錄是任何應(yīng)用程序開發(fā)過程中的一個(gè)重要部分,它幫助開發(fā)人員了解應(yīng)用程序的運(yùn)行狀態(tài)、診斷問題并進(jìn)行有效的錯(cuò)誤跟蹤。SpringBoot3
提供了一個(gè)強(qiáng)大的日志管理系統(tǒng),支持各種日志框架,并提供了簡(jiǎn)單的配置方法。本教程將介紹 SpringBoot3
中的日志系統(tǒng),包括默認(rèn)配置、如何自定義日志設(shè)置以及如何使用不同的日志框架。
默認(rèn)日志配置
日志門面
SpringBoot3
默認(rèn)是使用 slf4j + Logback
作為默認(rèn)的日志門面和實(shí)現(xiàn),但也支持其他日志系統(tǒng),如 Log4j2
、JUL (Java Util Logging)
,這是通過所謂的日志門面實(shí)現(xiàn)的,開發(fā)者可以根據(jù)自己的需求選擇合適的日志實(shí)現(xiàn)框架進(jìn)行配置。
在 SpringBoot
中,日志門面是指通過引入日志框架的抽象層來統(tǒng)一管理應(yīng)用程序中的日志輸出。SpringBoot
內(nèi)置了 Commons Logging
、SLF4J
或 jboss-logging
作為日志抽象層(門面),具體的實(shí)現(xiàn)可以是 Log4j
、JUL
、Log4j2
或 Logback
。
通過使用日志門面,開發(fā)者可以在不改變應(yīng)用程序代碼的情況下,靈活地切換和配置不同的日志實(shí)現(xiàn)框架,從而更好地適應(yīng)不同的部署環(huán)境和需求。這樣一來,開發(fā)者可以更方便地進(jìn)行日志輸出的管理和調(diào)整,提高應(yīng)用程序的可維護(hù)性和擴(kuò)展性。
如何實(shí)現(xiàn)默認(rèn)配置
以導(dǎo)入 spring-boot-starter-web
為例,它會(huì)導(dǎo)入 spring-boot-starter
。
spring-boot-starter
直接引入了 spring-boot-starter-logging
日志相關(guān)配配置(而不是通過 XxxAutoConfiguration
,這是因?yàn)?nbsp;SpringBoot
啟動(dòng)的時(shí)候就要用到日志,需要內(nèi)置進(jìn) SpringBoot
中)。
日志相關(guān)文件在這里,可以看到相關(guān)的默認(rèn)配置文件:
另外 spring-boot
包 additional-spring-configuration-metadata.json
文件下會(huì)有日志相關(guān)一些默認(rèn)值的格式,這些默認(rèn)值可以通過配置文件進(jìn)行修改。
自定義日志配置
雖然默認(rèn)配置對(duì)于開發(fā)時(shí)足夠使用,但在生產(chǎn)環(huán)境中,你可能需要自定義日志設(shè)置,例如更改日志級(jí)別、格式或輸出目的地。
日志級(jí)別
默認(rèn)日志級(jí)別:
由低到高:
ALL,TRACE, DEBUG, INFO, WARN, ERROR,FATAL,OFF
;- 只會(huì)打印指定級(jí)別及以上級(jí)別的日志
- ALL:打印所有日志
- TRACE:追蹤框架詳細(xì)流程日志,一般不使用
- DEBUG:開發(fā)調(diào)試細(xì)節(jié)日志
- INFO:關(guān)鍵、感興趣信息日志
- WARN:警告但不是錯(cuò)誤的信息日志,比如:版本過時(shí)
- ERROR:業(yè)務(wù)錯(cuò)誤日志,比如出現(xiàn)各種異常
- FATAL:致命錯(cuò)誤日志,比如
jvm
系統(tǒng)崩潰 - OFF:關(guān)閉所有日志記錄
不指定級(jí)別的所有類,都使用 root 指定的級(jí)別作為默認(rèn)級(jí)別
SpringBoot3
日志默認(rèn)級(jí)別是INFO
你可以在 application.yml
或 application.properties
文件中設(shè)置不同包的日志級(jí)別:
logging: level: root: WARN org.springframework.web: DEBUG com.coderjia: INFO
這里,root
級(jí)別被設(shè)為 WARN
,Spring web
包日志級(jí)別設(shè)為 DEBUG
,而你自己的公司代碼 com.coderjia
設(shè)為 INFO
級(jí)別。
日志分組
可以將相關(guān)的包分組在一起,統(tǒng)一進(jìn)行日志級(jí)別配置配置。比如:Tomcat 相關(guān)的日志統(tǒng)一設(shè)置。
logging: group: tomcat: org.apache.catalina,org.apache.coyote,org.apache.tomcat level: root: debug sql: debug tomcat: info web: info
以上將 org.apache.catalina,org.apache.coyote,org.apache.tomcat
分組為 tomcat
,并通過 logging.level.tomcat=info
將 tomcat
組日志級(jí)別設(shè)置為 info
。另外 SpringBoot
預(yù)定義兩個(gè)組 sql
和 web
:
- web:org.springframework.core.codec, org.springframework.http, org.springframework.web, org.springframework.boot.actuate.endpoint.web, org.springframework.boot.web.servlet.ServletContextInitializerBeans ;
- sql:org.springframework.jdbc.core, org.hibernate.SQL, org.jooq.tools.LoggerListener。
日志格式
默認(rèn)日志格式如下:
2024-03-06T11:30:42.611+08:00 INFO 31412 --- [ main] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat started on port 8083 (http) with context path '' 2024-03-06T11:30:42.618+08:00 INFO 31412 --- [ main] c.c.b.SpringBoot303LoggingApplication : Started SpringBoot303LoggingApplication in 1.602 seconds (process running for 2.442)
格式:
- 時(shí)間和日期:毫秒級(jí)精度
- 日志級(jí)別:
ERROR, WARN, INFO, DEBUG, or TRACE
- 進(jìn)程 ID
- —: 消息分割符
- 線程名: 使用
[]
包含 - Logger 名: 通常是產(chǎn)生日志的類名
- 消息: 日志記錄的內(nèi)容
默認(rèn)值:可以參照 spring-boot
包additional-spring-configuration-metadata.json
文件中的 logging.pattern.console
項(xiàng):
可修改為:
logging: pattern: console: '%d{yyyy-MM-dd HH:mm:ss} %-5level [%thread] %logger{15} : %msg%n' dateformat: '"yyyy-MM-dd HH:mm"'
logging.pattern.console
:定義輸出的格式,logging.pattern.dateformat
: 定義輸出日期格式。
2024-03-06 11:36:51 INFO [main] o.s.b.w.e.t.TomcatWebServer : Tomcat started on port 8083 (http) with context path ''
日志輸出
默認(rèn)情況下,日志輸出到控制臺(tái)。但你可以配置它輸出到文件或同時(shí)輸出到文件和控制臺(tái):
logging: file: name: my.log path: /var/logs
這將會(huì)在 /var/logs
路徑下創(chuàng)建一個(gè) my.log
文件記錄日志,logging.file.name=/var/log/my.log
也可以即定義路徑又定義名稱。
## 日志歸檔
如果使用 SpringBoot
默認(rèn)的 Logback
框架,可以通過 application.properties/yaml
文件指定日志歸檔文件名和滾動(dòng)規(guī)則,如果是其他日志系統(tǒng),需要自行配置(添加 log4j2.xml
或 log4j2-spring.xml
)。
logging: logback: rollingpolicy: file-name-pattern: ${LOG_FILE}.%d{yyyy-MM-dd}.%i.gz) max-file-size: 12MB
配置項(xiàng)如下:
配置項(xiàng) | 描述 |
---|---|
logging.logback.rollingpolicy.file-name-pattern | 日志存檔的文件名格式(默認(rèn)值:${LOG_FILE}.%d{yyyy-MM-dd}.%i.gz) |
logging.logback.rollingpolicy.clean-history-on-start | 應(yīng)用啟動(dòng)時(shí)是否清除以前存檔(默認(rèn)值:false) |
logging.logback.rollingpolicy.max-file-size | 存檔前,每個(gè)日志文件的最大大?。J(rèn)值:10MB) |
logging.logback.rollingpolicy.total-size-cap | 日志文件被刪除之前,可以容納的最大大?。J(rèn)值:0B)。設(shè)置 1GB 則磁盤存儲(chǔ)超過 1GB 日志后就會(huì)刪除舊日志文件 |
logging.logback.rollingpolicy.max-history | 日志文件保存的最大天數(shù)(默認(rèn)值:7). |
自定義 Logback 配置
對(duì)于更高級(jí)的配置,例如滾動(dòng)策略、過濾器等,你可以通過提供自定義的 Logback
配置文件來實(shí)現(xiàn)。創(chuàng)建一個(gè)名為 logback-spring.xml
的文件,并放在 src/main/resources
目錄下:
<configuration> <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender"> <encoder> <pattern>%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{36} - %msg%n</pattern> </encoder> </appender> <root level="INFO"> <appender-ref ref="STDOUT"/> </root> </configuration>
這個(gè)自定義配置將日志輸出格式修改為指定的模式,另外建議自定義配置,配置文件名加上 xxx-spring.xml
(例如,logback-spring.xml
而不是 logback.xml
),這樣更容易被Spring。
切換日志框架
如果你更喜歡使用 Log4j2
而不是 Logback
,你可以輕松切換。首先,排除 SpringBoot
的默認(rèn)日志啟動(dòng)器,然后添加 Log4j2
的依賴:
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-logging</artifactId> <exclusions> <exclusion> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-log4j2</artifactId> </exclusion> </exclusions> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-log4j2</artifactId> </dependency>
然后,你可以像以前一樣配置 Log4j2
,Spring Boot
會(huì)自動(dòng)識(shí)別并應(yīng)用 Log4j2
的配置。此外如果引入的依賴中自帶日志和當(dāng)前 SpringBoot
默認(rèn)日志不一致,也可以排查掉依賴中的日志組件。
日志使用
方式一:LoggerFactory 獲取Logger對(duì)象
在需要打日志的類中定義。
@SpringBootApplication public class SpringBoot303LoggingApplication { private static Logger log = LoggerFactory.getLogger(SpringBoot303LoggingApplication.class); public static void main(String[] args) { SpringApplication.run(SpringBoot303LoggingApplication.class, args); log.info("啟動(dòng)完成"); } }
方式二:引入 lombok
使用
@Slf4j
注解可以自動(dòng)生成一個(gè)log
對(duì)象,省去了手動(dòng)獲取Logger
對(duì)象的步驟,簡(jiǎn)化了代碼編寫。
導(dǎo)入依賴:
<dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <scope>compile</scope> </dependency>
添加注接 @Slf4j
:
@Slf4j @SpringBootApplication public class SpringBoot303LoggingApplication { // private static Logger log = LoggerFactory.getLogger(SpringBoot303LoggingApplication.class); public static void main(String[] args) { SpringApplication.run(SpringBoot303LoggingApplication.class, args); log.info("啟動(dòng)完成"); } }
總結(jié)
SpringBoot3
提供了一個(gè)靈活且強(qiáng)大的日志系統(tǒng),支持多種日志框架和豐富的配置選項(xiàng)。通過適當(dāng)?shù)呐渲?,你可以輕松管理和監(jiān)控你的應(yīng)用程序日志,幫助你更有效地開發(fā)和維護(hù)你的 SpringBoot
應(yīng)用。理解和掌握 SpringBoot
中的日志配置,將使你能夠更好地控制應(yīng)用程序的日志記錄行為。
- springboot的logging.group日志分組方法源碼流程解析
- springboot的LogbackLoggingSystem配置加載流程解析
- SpringBoot中的Logging詳解
- SpringBoot之配置logging日志及在控制臺(tái)中輸出過程
- 解決springboot yml配置 logging.level 報(bào)錯(cuò)問題
- SpringBoot集成slf4j日志配置的方法
- SpringBoot項(xiàng)目的logback日志配置(包括打印mybatis的sql語(yǔ)句)
- 基于logback 實(shí)現(xiàn)springboot超級(jí)詳細(xì)的日志配置
- SpringBoot 下在 yml 中的 logging 日志配置方法
相關(guān)文章
Struts1簡(jiǎn)介和入門_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理
這篇文章主要為大家詳細(xì)介紹了Struts1簡(jiǎn)介和入門的相關(guān)資料,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-09-09詳解使用Spring的restTemplete進(jìn)行Http請(qǐng)求
本篇文章主要介紹了詳解使用Spring的restTemplete進(jìn)行Http請(qǐng)求,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-06-06郵件收發(fā)原理你了解嗎? 郵件發(fā)送基本過程與概念詳解(一)
你真的了解郵件收發(fā)原理嗎?這篇文章主要為大家詳細(xì)介紹了郵件發(fā)送基本過程與概念,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-10-10web中拖拽排序和java后臺(tái)交互實(shí)現(xiàn)方法示例
這篇文章主要給大家介紹了關(guān)于web中拖拽排序和java后臺(tái)交互實(shí)現(xiàn)的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2018-12-12SpringBoot實(shí)現(xiàn)過濾器和攔截器的方法
大家應(yīng)該都曉得實(shí)現(xiàn)過濾器需要實(shí)現(xiàn)?javax.servlet.Filter?接口,而攔截器會(huì)在處理指定請(qǐng)求之前和之后進(jìn)行相關(guān)操作,配置攔截器需要兩步,本文通過實(shí)例代碼給大家介紹SpringBoot?過濾器和攔截器的相關(guān)知識(shí),感興趣的朋友一起看看吧2022-11-11SpringBoot實(shí)現(xiàn)動(dòng)態(tài)數(shù)據(jù)源切換的方法總結(jié)
項(xiàng)目開發(fā)中經(jīng)常會(huì)遇到多數(shù)據(jù)源同時(shí)使用的場(chǎng)景,比如冷熱數(shù)據(jù)的查詢等情況,所以接下來本文就來介紹一下如何使用實(shí)現(xiàn)自定義注解的形式來實(shí)現(xiàn)動(dòng)態(tài)數(shù)據(jù)源切換吧2023-12-12dubbo新手學(xué)習(xí)之事件通知實(shí)踐教程
這篇文章主要給大家介紹了關(guān)于dubbo新手學(xué)習(xí)之事件通知實(shí)踐的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-09-09