一、Logback
-
在 Spring Boot 中,日志框架默認使用的是 Logback,Spring Boot 提供了對日志配置的簡化
-
Spring Boot 默認會將日志輸出到控制臺,并且日志級別為 INFO
-
可以在
application.yaml
或application.properties
文件中進行日志配置 -
如果需要自定義日志配置,可以使用
logback-spring.xml
文件,Spring Boot 會自動加載該文件
二、日志級別
1、基本介紹
(1)INFO
-
一般信息,用于記錄應用程序的運行狀態
-
適用于記錄應用程序的關鍵事件,例如,啟動、關閉、重要配置加載等
-
用于提供足夠信息,幫助了解應用狀態,同時避免過多細節
(2)WARN
-
警告信息,表示潛在的問題
-
適用于記錄潛在的問題,例如,配置不當、資源不足等,這些問題不會立即影響運行,但需關注
-
用于幫助發現并預防潛在問題
(3)ERROR
-
錯誤信息,表示發生了錯誤,但應用程序仍可運行
-
適用于記錄嚴重錯誤,如數據庫連接失敗、關鍵業務邏輯異常等
-
用于快速定位和解決重大問題
(4)DEBUG
-
調試信息,用于開發階段
-
適用于調試時,記錄詳細執行流程、變量值等
-
通常關閉,避免日志量過大,必要時可臨時開啟
(5)TRACE
-
最詳細的日志信息,通常用于調試
-
適用于記錄最詳細的執行信息,用于深度調試
-
一般不開啟,除非有特殊需求
2、小結
-
應選擇合適的日志級別以確保既能捕獲關鍵信息,又不會產生過多冗余日志
-
生產環境通常設置為 INFO
-
可根據需求調整特定包的日志級別,例如,將某些復雜模塊設為 DEBUG
三、Spring Boot 自定義日志打印
1、配置文件
- 在
logback-spring.xml
文件中配置如下內容
<?xml version="1.0" encoding="UTF-8"?>
<configuration><!-- 定義日志輸出格式 --><property name="CONSOLE_PATTERN" value="[%-5p] %d{yyyy-MM-dd HH:mm:ss} - %m%n"/><property name="FILE_PATTERN" value="%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5p %logger{1}:%line - %m%n"/><!-- 控制臺輸出 --><appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender"><encoder><pattern>${CONSOLE_PATTERN}</pattern></encoder></appender><!-- 每日滾動文件輸出 --><appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender"><file>d:/my-logs/application.log</file><rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"><fileNamePattern>d:/my-logs/application.%d{yyyy-MM-dd}.log</fileNamePattern><maxHistory>30</maxHistory> <!-- 保留歷史日志文件的最大天數 --></rollingPolicy><encoder><pattern>${FILE_PATTERN}</pattern></encoder></appender><!-- 根日志配置 --><root level="info"><appender-ref ref="CONSOLE"/><appender-ref ref="FILE"/></root></configuration>
2、測試代碼
@Component
public class LogTest {private static final Logger logger = LoggerFactory.getLogger(LogTest.class);@PostConstructpublic void test1() {logger.debug("This is a debug message");logger.info("This is an info message");logger.warn("This is a warning message");logger.error("This is an error message");}
}
四、Spring Boot 自定義日志打印解讀
1、配置文件
(1)定義日志輸出格式
<property name="CONSOLE_PATTERN" value="[%-5p] %d{yyyy-MM-dd HH:mm:ss} - %m%n"/>
<property name="FILE_PATTERN" value="%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5p %logger{1}:%line - %m%n"/>
CONSOLE_PATTERN
是控制臺日志的輸出格式
-
%-5p
:日志級別(例如,INFO、ERROR),左對齊,占 5 個字符 -
%d{yyyy-MM-dd HH:mm:ss}
:日志時間戳 -
%m
:日志消息 -
%n
:換行符
# 輸出示例[INFO ] 2023-10-01 12:34:56 - This is a log message
FILE_PATTERN
是文件日志的輸出格式。
-
%d{yyyy-MM-dd HH:mm:ss}
:日志時間戳 -
[%thread]
:當前線程名 -
%-5p
:日志級別 -
%logger{1}:%line
:日志記錄器的名稱(只顯示最后一部分)和代碼行號 -
%m
:日志消息 -
%n
:換行符
# 輸出示例2023-10-01 12:34:56 [main] INFO com.example.MyClass:42 - This is a log message
(2)控制臺輸出配置
<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender"><encoder><pattern>${CONSOLE_PATTERN}</pattern></encoder>
</appender>
-
CONSOLE
:定義一個名為CONSOLE
的日志輸出目標,輸出到控制臺 -
ConsoleAppender
:將日志輸出到控制臺 -
encoder
:定義日志的輸出格式,使用前面定義的CONSOLE_PATTERN
(3)文件輸出配置
<appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender"><file>d:/my-logs/application.log</file><rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"><fileNamePattern>d:/my-logs/application.%d{yyyy-MM-dd}.log</fileNamePattern><maxHistory>30</maxHistory></rollingPolicy><encoder><pattern>${FILE_PATTERN}</pattern></encoder>
</appender>
-
FILE
:定義一個名為FILE
的日志輸出目標,輸出到文件 -
RollingFileAppender
:支持日志文件滾動(按時間或大小分割) -
file
:當前日志文件的路徑為d:/my-logs/application.log
-
rollingPolicy
:定義日志滾動策略 -
TimeBasedRollingPolicy
:按時間滾動日志文件 -
fileNamePattern
:滾動后的日志文件命名格式,例如application.2023-10-01.log
-
maxHistory
:保留最近 30 天的日志文件,超過 30 天的文件會被自動刪除 -
encoder
:定義日志的輸出格式,使用前面定義的FILE_PATTERN
(4)根日志配置
<root level="info"><appender-ref ref="CONSOLE"/><appender-ref ref="FILE"/>
</root>
-
root
:定義根日志記錄器 -
level="info"
:設置日志級別為 INFO,即只記錄 INFO 及以上級別(例如,WARN、ERROR)的日志 -
appender-ref
:將日志輸出到CONSOLE
和FILE
兩個目標
2、測試代碼
(1)創建 Logger 實例
private static final Logger logger = LoggerFactory.getLogger(LogTest.class);
-
LoggerFactory 是 SLF4J 提供的工廠類,用于創建 Logger 實例
-
getLogger(LogTest.class)
方法會根據傳入的類(LogTest.class
)創建一個與該類關聯的 Logger 實例 -
日志輸出時會自動帶上類名(LogTest),方便定位日志來源
(2)打印日志
logger.debug("This is a debug message");
logger.info("This is an info message");
logger.warn("This is a warning message");
logger.error("This is an error message");