資深架構師教你:Spring Boot日誌配置

日誌,通常不會在需求階段作為一個功能單獨提出來,也不會在產品方案中看到它的細節。但是,這絲毫不影響它在任何一個系統中的重要的地位。

為了保證服務的高可用,發現問題一定要即使,解決問題一定要迅速,所以生產環境一旦出現問題,預警系統就會通過郵件、短信甚至電話的方式實施多維轟炸模式,確保相關負責人不錯過每一個可能的bug。

預警系統判斷疑似bug大部分源於日誌。比如某個微服務接口由於各種原因導致頻繁調用出錯,此時調用端會捕獲這樣的異常並打印ERROR級別的日誌,當該錯誤日誌達到一定次數出現的時候,就會觸發報警。


try {
調用某服務
} catch(Exception e) {
LOG.error("錯誤信息", e);
}

所以日誌至關重要,這篇就來介紹下在Spring Boot如何配置日誌。

Spring Boot默認日誌系統

Spring Boot默認使用LogBack日誌系統,如果不需要更改為其他日誌系統如Log4j2等,則無需多餘的配置,LogBack默認將日誌打印到控制檯上。

如果要使用LogBack,原則上是需要添加dependency依賴的


org.springframework.boot
spring-boot-starter-logging

但是因為新建的Spring Boot項目一般都會引用spring-boot-starter或者spring-boot-starter-web,而這兩個起步依賴中都已經包含了對於spring-boot-starter-logging的依賴,所以,無需額外添加依賴。

我們基於《沒做過大項目,但我會建大項目》中創建的項目,啟動springboot-demo項目,可以看到打印的日誌信息如下。

資深架構師教你:Spring Boot日誌配置

以上至默認配置啟動下的日誌顯示情況,如果需要做一些定製的日誌配置比如將日誌存儲到文件等應該如何配置,下面就通過幾個小問題來看看Spring Boot下是如何解決這些問題的。

如何在項目中打印日誌

新建一個配置類LogConfig,注入一個Bean,並在方法中打印日誌


package com.jackie.springbootdemo.config;
import com.jackie.springbootdemo.model.Person;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration public class LogConfig {
private static final Logger LOG = LoggerFactory.getLogger(LogConfig.class);
@Bean
public Person logMethod() {
LOG.info("==========print log==========");
return new Person();
}
}

運行SpringBootDemoApplication,可以看到控制檯的日誌

資深架構師教你:Spring Boot日誌配置

Spring Boot默認的日誌級別為INFO,這裡打印的是INFO級別的日誌所以可以顯示。

很多開發者在日常寫private static final Logger LOG = LoggerFactory.getLogger(LogConfig.class);總覺得後面的LogConfig.class可有可無,因為隨便寫個其他類也不會報錯,但是準確編寫class信息能夠提供快速定位日誌的效率。

我們看到打印的日誌內容左側就是對應的類名稱,這個是通過private static final Logger LOG = LoggerFactory.getLogger(LogConfig.class);實現的。

如果將LogConfig.class換成xxx.class,輸出日誌就會顯示對應的xxx類名。這樣聲明的好處就是方便定位日誌。

如何將日誌信息存儲到文件

在本機環境,我們習慣在控制檯看日誌,但是線上我們還是要通過將日誌信息保存到日誌文件中,查詢日誌文件即可。

那麼應該如何配置才能將日誌信息保存到文件呢?

在我們創建的springboot-demo項目中,resources目錄下有個application.properties文件(如果是application.yml文件也是同樣的道理,只是採用的不同的編寫風格而已)。添加如下配置

 

logging.path=/Users/jackie/workspace/rome/
logging.file=springbootdemo.log

logging.path

該屬性用來配置日誌文件的路徑

logging.file

該屬性用來配置日誌文件名,如果該屬性不配置,默認文件名為spring.log

運行SpringBootDemoApplication

資深架構師教你:Spring Boot日誌配置

可以看到在指定路徑下生成了springbootdemo.log文件,該文件內容和控制檯打印內容一致。

如果註釋logging.file=springbootdemo.log則生成默認文件名spring.log

資深架構師教你:Spring Boot日誌配置

如何設置日誌級別

日誌級別總共有TARCE < DEBUG < INFO < WARN < ERROR < FATAL ,且級別是逐漸提供,如果日誌級別設置為INFO,則意味TRACE和DEBUG級別的日誌都看不到。

上例中我們打印了一個INFO級別的日誌,因為Spring Boot默認級別就是INFO,如果我們改為WARN,是否還能看到這行日誌信息。

logging.level

該屬性用於配置日誌級別。

在applicaition.properties中添加


logging.level.root=warn

這裡是用的root級別,即項目的所有日誌,我們也可以使用package級別,即指定包下使用相應的日誌級別,下面再看。

啟動SpringBootDemoApplication

資深架構師教你:Spring Boot日誌配置

你沒看錯,這個項目是成功啟動了,但是幾乎沒有內容,這是因為之前打印的日誌級別都是INFO,這裡設置為WARN,所以INFO級別的日誌都不顯示。

這裡我們可以改動root還是INFO級別,將指定包下的日誌級別設置為WARN


logging.level.root=INFO
logging.level.com.jackie.springbootdemo.config=WARN

啟動SpringBootDemoApplication

資深架構師教你:Spring Boot日誌配置

可以看到除了LogConfig類中的INFO級別的日誌沒有打印出來,其他的INFO級別的日誌都正常輸出了。

如何定製自己的日誌格式

在application.properties中添加


logging.pattern.console=%d{yyyy/MM/dd-HH:mm:ss} [%thread] %-5level %logger- %msg%n
logging.pattern.file=%d{yyyy/MM/dd-HH:mm} [%thread] %-5level %logger- %msg%n

logging.pattern.console

該屬性用於定製日誌輸出格式。

上述配置的編碼中,對應符號的含義如下


%d{HH:mm:ss.SSS}——日誌輸出時間
%thread——輸出日誌的進程名字,這在Web應用以及異步任務處理中很有用
%-5level——日誌級別,並且使用5個字符靠左對齊
%logger- ——日誌輸出者的名字
%msg——日誌消息
%n——平臺的換行符

啟動SpringBootDemoApplication

資深架構師教你:Spring Boot日誌配置

限於篇幅,還有相關特性,這裡不一一陳述了。

加Java架構師進階交流群獲取Java工程化、高性能及分佈式、高性能、深入淺出。高架構。性能調優、Spring,MyBatis,Netty源碼分析和大數據等多個知識點高級進階乾貨的直播免費學習權限 都是大牛帶飛 讓你少走很多的彎路的 群.號是 338549832 對了 小白勿進 最好是有開發經驗

注:加群要求

1、具有工作經驗的,面對目前流行的技術不知從何下手,需要突破技術瓶頸的可以加。

2、在公司待久了,過得很安逸,但跳槽時面試碰壁。需要在短時間內進修、跳槽拿高薪的可以加。

3、如果沒有工作經驗,但基礎非常紮實,對java工作機制,常用設計思想,常用java開發框架掌握熟練的,可以加。

4、覺得自己很牛B,一般需求都能搞定。但是所學的知識點沒有系統化,很難在技術領域繼續突破的可以加。

5.阿里Java高級大牛直播講解知識點,分享知識,多年工作經驗的梳理和總結,帶著大家全面、科學地建立自己的技術體系和技術認知!


分享到:


相關文章: