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


