Spring Boot 日志管理
1. 前言
誰能保證開發(fā)的軟件系統(tǒng)沒有問題?恐怕任何一個有經(jīng)驗的程序員都不敢承諾吧!
在軟件的設(shè)計、開發(fā)階段,大家都是盡心盡力去做好各項工作,期望能有一個滿意的效果。
但是一個投入生產(chǎn)環(huán)境、擁有眾多用戶的軟件系統(tǒng)必然是一個復(fù)雜的系統(tǒng)工程,不經(jīng)歷現(xiàn)實(shí)的檢驗,沒有人能準(zhǔn)確地知道它到底會不會有問題。
所以,日志是重要的,不可或缺的。日志是軟件系統(tǒng)出現(xiàn)故障時,分析問題的主要依據(jù)。就像飛機(jī)的黑匣子,平時感覺毫不起眼,到了關(guān)鍵時刻必須要依靠它!
2. Spring Boot 日志管理
2.1 默認(rèn)日志配置
Spring Boot 默認(rèn)已經(jīng)集成了日志功能,使用的是 logback 開源日志系統(tǒng)。
我們新建一個項目,Spring Boot 版本選擇 2.2.5 ,Group 為 com.5axxw , Artifact 為 spring-boot-log。生成項目后導(dǎo)入 Eclipse 開發(fā)環(huán)境,然后運(yùn)行啟動類,可以清楚地看到控制臺打印的日志信息。Spring Boot 日志默認(rèn)級別是 INFO ,下圖也輸出了幾條 INFO 級別的日志。
Spring Boot 默認(rèn)的日志輸出內(nèi)容含義如下:
- 日期時間:精確到毫秒。
- 日志級別:打印 ERROR 、 WARN 、 INFO 、 DEBUG 、 TRACE 等級別日志信息。
- 進(jìn)程 ID:當(dāng)前項目進(jìn)程 ID 。
- 分隔符:
---
是分隔符,分隔符后面代表具體的日志內(nèi)容。 - 線程名:方括號中間的內(nèi)容表示線程名稱。
- 類名:當(dāng)前日志打印所屬的類名稱。
- 日志內(nèi)容:開發(fā)人員設(shè)定的日志具體內(nèi)容。
2.2 日志級別控制
有時候,我們想指定打印的日志的級別,可以通過配置文件來設(shè)置。
實(shí)例:
# 設(shè)置日志級別
logging.level.root=WARN
上面的配置表示項目日志的記錄級別為 WARN ,所以會打印 WARN 及優(yōu)先級更高的 ERROR 級別的日志。此時我們編寫一個測試類,看看具體打印日志的情況。
實(shí)例:
@SpringBootTest
class LogTest {
private Logger logger = LoggerFactory.getLogger(this.getClass());
@Test
void testPrintLog() {
logger.trace("trace log");
logger.debug("debug log");
logger.info("info log");
logger.warn("warn log");
logger.error("error log");
}
}
運(yùn)行測試類,控制臺打印內(nèi)容如下,說明我們指定的日志級別生效了。
Tips:
logging.level.root=WARN
中的 root 可以改為指定包名或類名,表示設(shè)置指定包或者類的日志級別。
2.3 輸出日志文件
控制臺日志保存的內(nèi)容十分有限,大多數(shù)情況下我們需要將日志寫入文件,便于追溯。
可以通過配置文件指定日志文件,如下配置會將日志打印到 C:\\logs\\spring-boot-log.log
文件中。
實(shí)例:
# 設(shè)置日志文件
logging.file=C:\\logs\\spring-boot-log.log
也可以指定日志文件輸出的目錄, Spring Boot 項目會在指定輸出目錄下新建 spring.log
文件,并在文件中寫入日志。
實(shí)例:
# 設(shè)置日志目錄
logging.path=C:\\logs
Tips:如果同時配置了
logging.file
和ogging.path
,則只有logging.file
生效。
2.4 使用 lombok 插件簡化日志代碼
在上面的示例中,如果要打印日志,需要添加一行代碼 private Logger logger = LoggerFactory.getLogger(this.getClass());
還是比較麻煩的。我們可以安裝 lombok 插件,使用一個注解代替這行代碼。
2.4.1 下載 lombok 插件
從 lombok 下載鏈接 下載 lombok 插件。
2.4.2 安裝 lombok 插件
雙擊打開 lombok.jar ,點(diǎn)擊 Specify Location 按鈕,選擇 eclipse.exe ,然后點(diǎn)擊 Install 安裝插件。
2.4.3 引入 lombok 依賴
lombok 安裝后還需要引入依賴項,在 pom.xml 中添加如下依賴即可。
實(shí)例:
<!-- lombok -->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.12</version>
<scope>provided</scope>
</dependency>
2.4.4 使用注解輸出日志
此時,可以直接給類添加注解,然后就能直接輸出日志了。
實(shí)例:
@SpringBootTest
@Slf4j // 添加日志輸出注解
class LogTest {
// 不再需要定義 logger
// private Logger logger = LoggerFactory.getLogger(this.getClass());
@Test
void testPrintLog() {
// 直接使用log輸出日志
log.trace("trace log");
log.debug("debug log");
log.info("info log");
log.warn("warn log");
log.error("error log");
}
}
Tips:lombok 插件的功能比較強(qiáng)大,不僅可以簡化日志模板代碼,還可以自動生成常用的 getter /setter/toString 等模板代碼,感興趣的同學(xué)可以查閱相關(guān)資料。
3. 自定義日志配置
Spring Boot 也支持自定義日志配置,可以直接采用指定日志系統(tǒng)的配置文件,如 logback 、 log4j 。以 logback 為例,可以直接在 application.properties 文件中指定 logback 配置文件。
實(shí)例:
# 指定logback配置文件,位于resources目錄下
logging.config=classpath:logback-spring.xml
Tips:使用 logback 日志系統(tǒng)后,日志級別與日志文件等信息都可以使用 logback-spring.xml 文件設(shè)置,不再需要從 properties 文件中設(shè)置了。
在生產(chǎn)環(huán)境,我們希望指定日志保存的位置,另外日志不能無限制一直保存,一般情況下保存最近 30 天左右的日志即可。這些都可以在 logback-spring.xml 文件中指定,此處給出一個完整實(shí)例供大家參考。
實(shí)例:
<?xml version="1.0" encoding="UTF-8"?>
<!-- logback 配置 -->
<configuration>
<!-- 輸出到控制臺 -->
<appender name="STDOUT"
class="ch.qos.logback.core.ConsoleAppender">
<encoder
class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<!--格式化輸出:%d表示日期;%thread表示線程名;%-5level:左對齊并固定顯示5個字符;%msg:日志消息;%n:換行符; -->
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} -
%msg%n</pattern>
</encoder>
</appender>
<!-- 輸出到文件 -->
<appender name="FILE"
class="ch.qos.logback.core.rolling.RollingFileAppender">
<!-- 正在打印的日志文件 -->
<File>C:/logs/spring-boot-log.log</File>
<encoder>
<!--格式化輸出:%d表示日期;%thread表示線程名;%-5level:左對齊并固定顯示5個字符;%msg:日志消息;%n:換行符; -->
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} -
%msg%n
</pattern>
</encoder>
<!-- 日志文件的滾動策略 -->
<rollingPolicy
class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!-- 日志歸檔 -->
<fileNamePattern>C:/logs/spring-boot-log-%d{yyyy-MM-dd}.log
</fileNamePattern>
<!-- 保留30天日志 -->
<maxHistory>30</maxHistory>
</rollingPolicy>
</appender>
<!-- 指定日志輸出的級別 -->
<root level="INFO">
<appender-ref ref="STDOUT" />
<appender-ref ref="FILE" />
</root>
</configuration>
logback 日志系統(tǒng)的功能比較全面,網(wǎng)上可以查詢到的資料也非常多,大家可以自行查閱以做進(jìn)一步的了解。
4. 小結(jié)
Spring Boot 項目可以使用簡單的幾個配置,實(shí)現(xiàn)日志的打印,并設(shè)置相應(yīng)的級別、日志文件等信息。
如果想要對日志的方方面面進(jìn)行設(shè)定,也可以快速地集成常見的日志系統(tǒng)如 logback 、log4j 。
日志系統(tǒng)對生產(chǎn)環(huán)境項目來說是不可或缺的,大家可以選擇使用 Spring Boot 集成一種自己用起來順手的日志系統(tǒng)。