Spring Boot 使用slf4j進(jìn)行日志記錄
本來已收錄到我寫的10萬字Springboot經(jīng)典學(xué)習(xí)筆記中,筆記在持續(xù)更新……文末有領(lǐng)取方式
在開發(fā)中,我們經(jīng)常使用 System.out.println() 來打印一些信息,但是這樣不好,因?yàn)榇罅康氖褂?System.out 會(huì)增加資源的消耗。我們實(shí)際項(xiàng)目中使用的是 slf4j 的 logback 來輸出日志,效率挺高的,Spring Boot 提供了一套日志系統(tǒng),logback 是最優(yōu)的選擇。
1. slf4j 介紹
引用百度百科里的一段話:
SLF4J,即簡單日志門面(Simple Logging Facade for Java),不是具體的日志解決方案,它只服務(wù)于各種各樣的日志系統(tǒng)。按照官方的說法,SLF4J是一個(gè)用于日志系統(tǒng)的簡單Facade,允許最終用戶在部署其應(yīng)用時(shí)使用其所希望的日志系統(tǒng)。
這段的大概意思是:你只需要按統(tǒng)一的方式寫記錄日志的代碼,而無需關(guān)心日志是通過哪個(gè)日志系統(tǒng),以什么風(fēng)格輸出的。因?yàn)樗鼈內(nèi)Q于部署項(xiàng)目時(shí)綁定的日志系統(tǒng)。例如,在項(xiàng)目中使用了 slf4j 記錄日志,并且綁定了 log4j(即導(dǎo)入相應(yīng)的依賴),則日志會(huì)以 log4j 的風(fēng)格輸出;后期需要改為以 logback 的風(fēng)格輸出日志,只需要將 log4j 替換成 logback 即可,不用修改項(xiàng)目中的代碼。這對(duì)于第三方組件的引入的不同日志系統(tǒng)來說幾乎零學(xué)習(xí)成本,況且它的優(yōu)點(diǎn)不僅僅這一個(gè)而已,還有簡潔的占位符的使用和日志級(jí)別的判斷。
正因?yàn)?sfl4j 有如此多的優(yōu)點(diǎn),阿里巴巴已經(jīng)將 slf4j 作為他們的日志框架了。在《阿里巴巴Java開發(fā)手冊(cè)(正式版)》中,日志規(guī)約一項(xiàng)第一條就強(qiáng)制要求使用 slf4j:
1.【強(qiáng)制】應(yīng)用中不可直接使用日志系統(tǒng)(Log4j、Logback)中的API,而應(yīng)依賴使用日志框架SLF4J中的API,使用門面模式的日志框架,有利于維護(hù)和各個(gè)類的日志處理方式統(tǒng)一。
“強(qiáng)制”兩個(gè)字體現(xiàn)出了 slf4j 的優(yōu)勢(shì),所以建議在實(shí)際項(xiàng)目中,使用 slf4j 作為自己的日志框架。使用 slf4j 記錄日志非常簡單,直接使用 LoggerFactory 創(chuàng)建即可。
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class Test {
private static final Logger logger = LoggerFactory.getLogger(Test.class);
// ……
}
2. application.yml 中對(duì)日志的配置
Spring Boot 對(duì) slf4j 支持的很好,內(nèi)部已經(jīng)集成了 slf4j,一般我們?cè)谑褂玫臅r(shí)候,會(huì)對(duì)slf4j 做一下配置。application.yml 文件是 Spring Boot 中唯一一個(gè)需要配置的文件,一開始創(chuàng)建工程的時(shí)候是 application.properties 文件,個(gè)人比較細(xì)化用 yml 文件,因?yàn)?yml 文件的層次感特別好,看起來更直觀,但是 yml 文件對(duì)格式要求比較高,比如英文冒號(hào)后面必須要有個(gè)空格,否則項(xiàng)目估計(jì)無法啟動(dòng),而且也不報(bào)錯(cuò)。用 properties 還是 yml 視個(gè)人習(xí)慣而定,都可以。本課程使用 yml。
我們看一下 application.yml 文件中對(duì)日志的配置:
logging:
config: logback.xml
level:
com.itcodai.course03.dao: trace
logging.config 是用來指定項(xiàng)目啟動(dòng)的時(shí)候,讀取哪個(gè)配置文件,這里指定的是日志配置文件是根路徑下的 logback.xml 文件,關(guān)于日志的相關(guān)配置信息,都放在 logback.xml 文件中了。logging.level 是用來指定具體的 mapper 中日志的輸出級(jí)別,上面的配置表示 com.itcodai.course03.dao 包下的所有 mapper 日志輸出級(jí)別為 trace,會(huì)將操作數(shù)據(jù)庫的 sql 打印出來,開發(fā)時(shí)設(shè)置成 trace 方便定位問題,在生產(chǎn)環(huán)境上,將這個(gè)日志級(jí)別再設(shè)置成 error 級(jí)別即可(本節(jié)課不討論 mapper 層,在后面 Spring Boot 集成 MyBatis 時(shí)再詳細(xì)討論)。
常用的日志級(jí)別按照從高到低依次為:ERROR、WARN、INFO、DEBUG。
3. logback.xml 配置文件解析
在上面 application.yml 文件中,我們指定了日志配置文件 logback.xml,logback.xml 文件中主要用來做日志的相關(guān)配置。在 logback.xml 中,我們可以定義日志輸出的格式、路徑、控制臺(tái)輸出格式、文件大小、保存時(shí)長等等。下面來分析一下:
3.1 定義日志輸出格式和存儲(chǔ)路徑
<configuration>
<property name="LOG_PATTERN" value="%date{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n" />
<property name="FILE_PATH" value="D:/logs/course03/demo.%d{yyyy-MM-dd}.%i.log" />
configuration>
我們來看一下這個(gè)定義的含義:首先定義一個(gè)格式,命名為 “LOG_PATTERN”,該格式中 %date 表示日期,%thread 表示線程名,%-5level 表示級(jí)別從左顯示5個(gè)字符寬度,%logger{36} 表示 logger 名字最長36個(gè)字符,%msg 表示日志消息,%n 是換行符。
然后再定義一下名為 “FILE_PATH” 文件路徑,日志都會(huì)存儲(chǔ)在該路徑下。%i 表示第 i 個(gè)文件,當(dāng)日志文件達(dá)到指定大小時(shí),會(huì)將日志生成到新的文件里,這里的 i 就是文件索引,日志文件允許的大小可以設(shè)置,下面會(huì)講解。這里需要注意的是,不管是 windows 系統(tǒng)還是 Linux 系統(tǒng),日志存儲(chǔ)的路徑必須要是絕對(duì)路徑。
3.2 定義控制臺(tái)輸出
<configuration>
<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>${LOG_PATTERN}pattern>
encoder>
appender>
configuration>
使用
節(jié)點(diǎn)設(shè)置個(gè)控制臺(tái)輸出(class="ch.qos.logback.core.ConsoleAppender")的配置,定義為 “CONSOLE”。使用上面定義好的輸出格式(LOG_PATTERN)來輸出,使用 ${} 引用進(jìn)來即可。
3.3 定義日志文件的相關(guān)參數(shù)
<configuration>
<appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>${FILE_PATH}fileNamePattern>
<maxHistory>15maxHistory>
<timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<maxFileSize>10MBmaxFileSize>
timeBasedFileNamingAndTriggeringPolicy>
rollingPolicy>
<encoder>
<pattern>${LOG_PATTERN}pattern>
encoder>
appender>
configuration>
使用
定義一個(gè)名為 “FILE” 的文件配置,主要是配置日志文件保存的時(shí)間、單個(gè)日志文件存儲(chǔ)的大小、以及文件保存的路徑和日志的輸出格式。
3.4 定義日志輸出級(jí)別
<configuration>
<logger name="com.itcodai.course03" level="INFO" />
<root level="INFO">
<appender-ref ref="CONSOLE" />
<appender-ref ref="FILE" />
root>
configuration>
有了上面那些定義后,最后我們使用
來定義一下項(xiàng)目中默認(rèn)的日志輸出級(jí)別,這里定義級(jí)別為 INFO,然后針對(duì) INFO 級(jí)別的日志,使用
引用上面定義好的控制臺(tái)日志輸出和日志文件的參數(shù)。這樣 logback.xml 文件中的配置就設(shè)置完了。
4. 使用Logger在項(xiàng)目中打印日志
在代碼中,我們一般使用 Logger 對(duì)象來打印出一些 log 信息,可以指定打印出的日志級(jí)別,也支持占位符,很方便。
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping("/test")
public class TestController {
private final static Logger logger = LoggerFactory.getLogger(TestController.class);
@RequestMapping("/log")
public String testLog() {
logger.debug("=====測(cè)試日志debug級(jí)別打印====");
logger.info("======測(cè)試日志info級(jí)別打印=====");
logger.error("=====測(cè)試日志error級(jí)別打印====");
logger.warn("======測(cè)試日志warn級(jí)別打印=====");
// 可以使用占位符打印出一些參數(shù)信息
String str1 = "武哥聊編程";
String str2 = "blog.csdn.net/eson_15";
logger.info("======武哥的公眾號(hào):{};武哥的CSDN博客:{}", str1, str2);
return "success";
}
}
啟動(dòng)該項(xiàng)目,在瀏覽器中輸入 localhost:8080/test/log 后可以看到控制臺(tái)的日志記錄:
======測(cè)試日志info級(jí)別打印===== =====測(cè)試日志error級(jí)別打印==== ======測(cè)試日志warn級(jí)別打印===== ======武哥的公眾號(hào):武哥聊編程;武哥的CSDN博客:blog.csdn.net/eson_15
因?yàn)?INFO 級(jí)別比 DEBUG 級(jí)別高,所以 debug 這條沒有打印出來,如果將 logback.xml 中的日志級(jí)別設(shè)置成 DEBUG,那么四條語句都會(huì)打印出來,這個(gè)大家自己去測(cè)試了。同時(shí)可以打開 D:\logs\course03\ 目錄,里面有剛剛項(xiàng)目啟動(dòng),以后后面生成的所有日志記錄。在項(xiàng)目部署后,我們大部分都是通過查看日志文件來定位問題。
5. 總結(jié)
本節(jié)課主要對(duì) slf4j 做了一個(gè)簡單的介紹,并且對(duì) Spring Boot 中如何使用 slf4j 輸出日志做了詳細(xì)的說明,著重分析了 logback.xml 文件中對(duì)日志相關(guān)信息的配置,包括日志的不同級(jí)別。最后針對(duì)這些配置,在代碼中使用 Logger 打印出一些進(jìn)行測(cè)試。在實(shí)際項(xiàng)目中,這些日志都是排查問題的過程中非常重要的資料。
該文已收錄到我寫的《10萬字Springboot經(jīng)典學(xué)習(xí)筆記》中,歡迎掃描下方二維碼領(lǐng)取全套筆記。
關(guān)注Java開發(fā)寶典
回復(fù):筆記
點(diǎn)贊是最大的支持


