三、Spring Boot 使用 slf4j 進行日 志記錄

上一節對 SpringBoot 的Spring Boot 返回Json數據及數據封裝做了一個介紹,本節主要對Spring Boot 使用 slf4j 進行日誌記錄 做一下講解和分析。

在開發中,我們經常使用 System.out.println() 來打印一些信息,但是這樣不好, 因爲大量的使用 System.out 會增加資源的消耗

我們實際項目中使用的是 slf4j 的 logback 來輸出日誌,效率挺高的,Spring Boot 提供了一套日誌系統,logback 是最優的選擇

1. slf4j 介紹

引用百度百科裏的一段話:

SLF4J,即簡單日誌門面(Simple Logging Facade for Java),不是具體的日誌解決方案,它只服務於各種各樣的日誌系統。按照官方的說法,SLF4J 是一個用於日誌系統的簡單 Facade,允許最終用戶在部署其應用時使用其所希望的日誌系統。

這段的大概意思是:你只需要按統一的方式寫記錄日誌的代碼,而無需關心日誌是通過 哪個日誌系統,以什麼風格輸出的。因爲它們取決於部署項目時綁定的日誌系統。例如,在項目中使用了 slf4j 記錄日誌,並且綁定了 log4j(即導入相應的依賴),則日誌 會以 log4j 的風格輸出;後期需要改爲以 logback 的風格輸出日誌,只需要將 log4j 替 換成 logback 即可,不用修改項目中的代碼。這對於第三方組件的引入的不同日誌系統 來說幾乎零學習成本,況且它的優點不僅僅這一個而已,還有簡潔的佔位符的使用和日誌級別的判斷。

正因爲 sfl4j 有如此多的優點,阿里巴巴已經將 slf4j 作爲他們的日誌框架了。在《阿里 巴巴 Java 開發手冊(正式版)》中,日誌規約一項第一條就強制要求使用 slf4j:

1.【強制】應用中不可直接使用日誌系統(Log4j、Logback) 
中的 API,而應依賴使用日誌框架 SLF4J 中的 API,使用門面模式的
日誌框架,有利於維護和各個類的日誌處理方式統一。

“強制”兩個字體現出了 slf4j 的優勢,所以建議在實際項目中,使用 slf4j 作爲自己的日誌框架。使用 slf4j 記錄日誌非常簡單,直接使用 LoggerFactory 創建即可。

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;


[@RestController](https://my.oschina.net/u/4486326)
@RequestMapping("/test")
public class TestController {

	private final static Logger logger = LoggerFactory.getLogger(TestController.class);

	//......
}

2. application.yml 中對日誌的配置

Spring Boot 對 slf4j 支持的很好,內部已經集成了 slf4j,一般我們在使用的時候,會對 slf4j 做一下配置。application.yml 文件是 Spring Boot 中唯一一個需要配置的文件,一開始創建工程的時候是 application.properties 文件,個人比較喜歡用 yml 文件,因爲 yml 文件的層次感特別好,看起來更直觀,但是 yml 文件對格式要求比較高,比如英文冒號後面必須要有個空格,否則項目估計無法啓動,而且也不報錯。用 properties 還是 yml 視個人習慣而定,都可以。本課程使用 yml

  • 我們看一下 application.yml 文件中對日誌的配置:

      logging:
        config: logback.xml
        level:
      	com.itcodai.course03.dao: trace
      server:
        port: 9003
    

logging.config 是用來指定項目啓動的時候,讀取哪個配置文件,這裏指定的是日誌配置文件是根路徑下的 logback.xml 文件(下圖),關於日誌的相關配置信息,都放在 logback.xml 文件中了。logging.level 是用來指定具體的 mapper 中日誌的輸出級別,上面的配置表示 com.itcodai.course03.dao 包下的所有 mapper 日誌輸出級別爲 trace,會將操作數據庫的 sql 打印出來,開發時設置成 trace 方便定位問題,在生產環境上,將這個日誌級別再設置成 error 級別即可(本節課不討論 mapper 層,在後面 Spring Boot 集成 MyBatis 時再詳細討論)。

常用的日誌級別按照從高到低依次爲:ERROR、WARN、INFO、DEBUG。

3. logback.xml 配置文件解析

在上面 application.yml 文件中,我們指定了日誌配置文件 logback.xml, logback.xml文件中主要用來做日誌的相關配置。在 logback.xml 中,我們可以定義 日誌輸出的格式、路徑、控制檯輸出格式、文件大小、保存時長等等。下面來分析一 下:

3.1 定義日誌輸出格式和存儲路徑

<configuration>
<!-- 格式化輸出:%date表示日期,%thread表示線程名,%-5level:級別從左顯示5個字符寬度 %msg:日誌消息,%n是換行符-->
	<property name="LOG_PATTERN" value="%date{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n" />

	<!-- 定義日誌存儲的路徑,不要配置相對路徑 -->
	<property name="FILE_PATH" value="F:/logs/course03/demo.%d{yyyy-MM-dd}.%i.log" />
</configuration>

我們來看一下這個定義的含義:首先定義一個格式,命名爲:LOG_PATTERN,該格式中 %date 表示日期, %thread表示爲線程名, -5level 表示級別從左顯示 5個字符寬度, %logger{36} 名字最常36個字符, %msg 表示日誌消息, %n 是換行符。

然後再定義一下名爲 “FILE_PATH” 文件路徑,日誌都會存儲在該路徑下。%i 表示第 i 個文件,當日志文件達到指定大小時,會將日誌生成到新的文件裏,這裏的 i 就是文件 索引,日誌文件允許的大小可以設置,下面會講解。這裏需要注意的是,不管是 windows 系統還是 Linux 系統,日誌存儲的路徑必須要是絕對路徑。

3.2 定義控制檯輸出

<configuration>
<!-- 控制檯輸出日誌 -->
<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
	<encoder>
		<!-- 按照上面配置的LOG_PATTERN來打印日誌 -->
		<pattern>${LOG_PATTERN}</pattern>
	</encoder>
</appender>
</configuration>

使用<appender>節點設置個控制檯輸出 (class="ch.qos.logback.core.ConsoleAppender")的配置,定義爲 CONSOLE。使用上面定義好的輸出格式(LOG_PATTERN)來輸出,使用 ${} 引用進來即可。

3.3 定義日誌文件的相關參數

<!--每天生成一個日誌文件,保存15天的日誌文件。rollingFile是用來切分文件的 -->
	<appender name="FILE"
			  class="ch.qos.logback.core.rolling.RollingFileAppender">
		<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
			<fileNamePattern>${FILE_PATH}</fileNamePattern>
			<!-- keep 15 days' worth of history -->
			<maxHistory>15</maxHistory>
			<timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
				<!-- 日誌文件的最大大小 -->
				<maxFileSize>10MB</maxFileSize>
			</timeBasedFileNamingAndTriggeringPolicy>
		</rollingPolicy>

		<encoder>
			<pattern>${LOG_PATTERN}</pattern>
		</encoder>
	</appender>

使用 <appender> 定義一個名爲 “FILE” 的文件配置,主要是配置日誌文件保存的時 間、單個日誌文件存儲的大小、以及文件保存的路徑和日誌的輸出格式。

3.4 定義日誌輸出級別

	<!-- project default level -->
	<logger name="com.itcodai.course03" level="INFO" />

	<!-- 日誌輸出級別 -->
	<root level="INFO">
		<appender-ref ref="CONSOLE" />
		<appender-ref ref="FILE" />
	</root>

有了上面那些定義後,最後我們使用 <logger> 來定義一下項目中默認的日誌輸出級別,這裏定義級別爲 INFO,然後針對 INFO 級別的日誌,使用 <root> 引用上面定義 好的控制檯日誌輸出和日誌文件的參數。這樣logback.xml 文件中的配置就設置完了。

最後附上一張整體圖片↓

4. 使用 Logger 在項目中打印日誌

在代碼中,我們一般使用 Logger 對象來打印出一些 log 信息,可以指定打印出的日誌 級別,也支持佔位符,很方便。

[@RestController](https://my.oschina.net/u/4486326)
@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級別打印=====");

		// 可以使用佔位符打印出一些參數信息
		String str1 = "blog.itcodai.com";
		String str2 = "blog.csdn.net/eson_15";
		logger.info("======理性思考的個人博客:{};理性思考的CSDN博客:{}", str1, str2);

		return "success";
	}
}

啓動該項目,在瀏覽器中輸入 localhost:9003/test/log 後可以看到控制檯的日誌記錄

因爲 INFO 級別比 DEBUG 級別高,所以 debug 這條沒有打印出來,如果將 logback.xml 中的日誌級別設置成 DEBUG,那麼四條語句都會打印出來,這個大家自 己去測試了。同時可以打開 F:\logs\course03\ 目錄,裏面有剛剛項目啓動,以後後面 生成的所有日誌記錄。在項目部署後,我們大部分都是通過查看日誌文件來定位問題

5. 總結

本節課主要對 slf4j 做了一個簡單的介紹,並且對 Spring Boot 中如何使用 slf4j 輸出日 志做了詳細的說明,着重分析了 logback.xml 文件中對日誌相關信息的配置,包括日 志的不同級別。最後針對這些配置,在代碼中使用 Logger 打印出一些進行測試。在實際項目中,這些日誌都是排查問題的過程中非常重要的資料。


希望可以繼續關注後續更新文章! 對自己的技術能力有明確的目標!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章