Spring 日志文件
文章目錄
- Spring 日志文件
- 日志有什么用?
- 日志怎么用?
- 自定義日志
- 在程序中獲取日志對象
- 常用日志框架說明
- 使用日志對象打印日志
- 日志格式說明
- 日志級別
- 日志級別有啥用
- 日志級別分類和使用
- 日志持久化保存
- 更簡單的日志輸出——lombok
- lombok更多注解說明
日志有什么用?
日志是程序的重要組成部分,想象一下,如果程序報錯了,不讓你打開控制臺看日志,那么你能找到報錯的原因嗎?
答案是否定的,寫程序不是買彩票,不能完全靠猜,因此日志對于我們來說,最主要的用途就是排除和定位問題
除了發現和定位問題之外,我們還可以通過日志實現以下功能:
- 記錄用戶登錄日志,方便分析用戶是正常登錄還是惡意破解用戶
- 記錄系統的操作日志,方便數據恢復和定位操作人
- 記錄程序的執行時間,方便為以后優化程序提供數據支持
以上這些都是日志提供的非常實用的功能
日志怎么用?
Spring項目在啟動的時候,默認就有日志輸出:
Spring Boot 輸出的控制臺日志信息引發三個問題:
- Spring Boot 內置日志框架
- 開發者如何在程序中自定義打印日志
- 如何將默認打印在控制臺且無法保存的日志永久保存
自定義日志
自定義日志實現步驟:
- 在程序中獲取日志對象
- 使用日志對象相關語法打印輸出需要內容
在程序中獲取日志對象
日志工廠需要將每個類的類型傳遞進去,這樣我們才知道日志的歸屬類,才能更方便、更直觀的定位到問題類
注意:Logger 對象是屬于 org.slf4j 包下的,不要導入錯包
因為 Spring Boot 中內置了日志框架 Slf4j,所以咱們可以直接在程序中調用 slf4j 來輸出日志
常用日志框架說明
組合方案 | 優勢 | 適用場景 |
---|---|---|
SLF4J + Logback | 集成簡單(Spring Boot 默認)、性能優 | 大多數 Spring Boot 項目、中小型應用 |
SLF4J + Log4j 2 | 高并發下性能極佳、功能最全 | 大型企業級應用、高流量系統 |
SLF4J + JUL | 無第三方依賴、輕量 | 極簡 demo 項目、無需復雜日志功能 |
Commons Logging + Log4j | 兼容老項目(如 Spring 3.x 及以前) | 老舊項目維護(不推薦新項目使用) |
使用日志對象打印日志
控制臺效果如下:
日志格式說明
日志級別
日志級別有啥用
-
日志的級別就是為了篩選符合目標的日志信息的。試想一下這樣的場景,假設你是一家2萬人公司的老板,那么每人員工的日常工作和瑣碎的信息都要反饋給你嗎?一定不會,因為你根本沒有那么多精力。于是就有了組織架構,而組織架構就會分級,有很多的級別設置,如下圖所示:
-
有了組織架構之后,就可以逐級別匯報消息了,例如:組員匯報給組長;組長匯報給研發一組;研發一組匯報給 Java 研發,等等依次進行匯報
-
而日志分級大概的道理也是一樣的,有了日志級別之后就可以過濾自己想看到的信息了,比如設置日志級別為 error,那么就可以只看程序的報錯日志了,對于普通的調試日志和業務日志就可以忽略了,從而節省開發者的信息篩選時間
日志級別分類和使用
日志的級別分為:
- trace:微量,少許的意思,級別最低
- info:普通的打印信息
- debug:需要調試時候的關鍵信息打印
- warn:警告,不影響使用,但需要注意的問題
- error:錯誤信息,級別較高的錯誤日志信息
- fatal:致命的,因為代碼異常導致程序退出執行的事件
注意??:
越往上,收到的信息就越少
日志的使用
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;@RestController
public class UserController {// 1. 注入Logger:參數為當前類的Class,便于定位日志歸屬private static final Logger logger = LoggerFactory.getLogger(UserController.class);@GetMapping("/login")public String login(String username, String password) {// 2. 打印不同級別的日志// trace:微量信息(如方法進入/退出,默認不輸出)logger.trace("進入login方法,參數:username={}, password=***", username);// debug:調試信息(如關鍵變量值,開發環境常用)logger.debug("驗證用戶[{}]的密碼長度:{}", username, password.length());// info:業務常規信息(如操作成功,生產環境可輸出核心業務日志)logger.info("用戶[{}]登錄成功,IP地址:192.168.1.100", username);// warn:警告信息(如非致命異常、參數不規范,需關注但不影響流程)if (password.length() < 6) {logger.warn("用戶[{}]使用弱密碼登錄,存在安全風險", username);}// error:錯誤信息(如業務異常、調用失敗,需排查問題)try {// 模擬調用數據庫失敗int result = 1 / 0;} catch (Exception e) {// 打印異常時,需將Exception對象作為最后一個參數傳入(便于輸出堆棧信息)logger.error("用戶[{}]登錄時數據庫操作失敗", username, e);}return "login success";}
}
默認日志輸出級別:
- 清除掉配置文件中的日志設置,觀察控制臺輸入的日志級別
- 得到以下結論,日志的輸出級別,默認為 info
日志持久化保存
在 Spring Boot 中,日志持久化是指將原本輸出到控制臺的日志,保存到文件系統中(如磁盤文件),以便后續追溯問題、分析系統運行狀態等。以下是實現日志持久化的核心配置和說明:
核心配置方式(application.yml
或 application.properties
)
Spring Boot 支持通過簡單的配置,指定日志文件的存儲目錄或具體文件名,底層日志框架(如 Logback、Log4j2)會自動將日志寫入對應位置。
- 配置日志存儲目錄
指定日志文件的存儲目錄,Spring Boot 會在該目錄下自動生成默認命名的日志文件(如spring.log
)。
yaml 配置(application.yml
):
logging:file:path: D:/logs/spring-boot # Windows 路徑(注意用 / 或 \\)# 或 Linux/Mac 路徑:/var/logs/spring-boot
properties 配置(application.properties
):
logging.file.path=D:/logs/spring-boot
# 或 Linux/Mac:logging.file.path=/var/logs/spring-boot
- 配置具體日志文件名
直接指定日志文件的完整路徑和文件名,日志會精確寫入該文件。
yaml 配置(application.yml
):
logging:file:name: D:/logs/spring-boot/my-app.log # Windows 路徑# 或 Linux/Mac:/var/logs/spring-boot/my-app.log
properties 配置(application.properties
):
logging.file.name=D:/logs/spring-boot/my-app.log
# 或 Linux/Mac:logging.file.name=/var/logs/spring-boot/my-app.log
更簡單的日志輸出——lombok
每次都使用 LoggerFactory.getLogger(xxx.class)
很繁瑣,且每個類都添加一遍,也很麻煩,這里講一種更好用的日志輸出方式,使用 lombok 來更簡單的輸出。
- 添加 lombok 框架支持。
- 使用
@Slf4j
注解輸出日志。
- 添加 lombok 依賴
<dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><version>1.18.20</version><optional>true</optional>
</dependency>
- 輸出日志
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;@RestController
@RequestMapping("/p")
@Slf4j
public class PersonController {@RequestMapping("/log")public void loggerTest() {log.error("---------------------- error ----------------------");}
}
注意:使用 @Slf4j
注解,在程序中使用 log
對象即可輸入日志,并且只能使用 log
對象才能輸出,這是 lombok 提供的對象名。
lombok更多注解說明
基本注解 | 作用 |
---|---|
@Getter | 自動添加 getter 方法 |
@Setter | 自動添加 setter 方法 |
@ToString | 自動添加 toString 方法 |
@EqualsAndHashCode | 自動添加 equals 和 hashCode 方法 |
@NoArgsConstructor | 自動添加無參構造方法 |
@AllArgsConstructor | 自動添加全屬性構造方法,順序按照屬性的定義順序 |
@NonNull | 屬性不能為 null |
@RequiredArgsConstructor | 自動添加必需屬性的構造方法,final + @NonNull 的屬性為必需 |
組合注解 | 作用 |
---|---|
@Data | @Getter + @Setter + @ToString + @EqualsAndHashCode + @RequiredArgsConstructor + @NoArgsConstructor |
日志注解 | 作用 |
---|---|
@Slf4j | 添加一個名為 log 的日志,使用 slf4j |