[特殊字符] Spring Boot 日志系統入門博客大綱(適合初學者)

一、前言

📌 為什么日志在項目中如此重要?

在開發和維護一個后端系統時,日志就像程序運行時的“黑匣子”,幫我們記錄系統的各種行為和異常。一份良好的日志,不僅能幫助我們快速定位問題,還能在以下場景中發揮關鍵作用:

  1. 調試問題:程序出錯時,可以通過日志快速追蹤到發生錯誤的地方和上下文。

  2. 系統監控:通過分析日志,可以了解系統的運行狀態,比如某個接口是否經常超時。

  3. 審計追蹤:記錄用戶行為、接口訪問等日志,有助于回溯歷史操作。

  4. 性能優化:記錄接口耗時,有助于發現性能瓶頸。

  5. 安全排查:某些攻擊行為可以通過日志分析提前發現,比如異常的訪問頻率。

🔍 簡單來說,日志是系統運行時的“眼睛”和“嘴巴”,沒有它,我們就像在黑暗中摸索,問題一多就會手足無措。


🧰 Spring Boot 對日志的支持有哪些特點?

Spring Boot 對日志系統做了很多“自動化”處理,對初學者非常友好:

  1. 默認集成 Logback + SLF4J

    • Spring Boot 自動幫你配置好日志系統,不用你從頭開始搭建。

    • 使用的是 SLF4J 作為日志門面,默認底層實現是 Logback,開箱即用。

  2. 自動控制臺輸出日志

    • 啟動項目時就能看到 INFO、WARN、ERROR 等日志輸出。

    • 不需要任何配置就可以看到清晰的啟動信息、異常堆棧等。

  3. 支持多種日志格式和輸出方式

    • 控制臺輸出、文件輸出、按天或文件大小自動切割歸檔。

    • 支持通過 application.propertieslogback-spring.xml 靈活配置。

  4. 支持不同環境配置日志級別

    • 可以根據環境(開發、測試、生產)設置不同的日志策略。

    • 避免開發環境日志過少、生產環境日志過多等問題。

  5. 與 Spring 框架深度集成

    • Spring Boot 各個組件、第三方依賴庫都統一使用日志門面,方便統一管理和配置。

🎯 總結一句話:Spring Boot 的日志系統 默認好用,擴展靈活,既適合入門,也能應對復雜需求。


二、日志基礎概念

🧠 什么是日志系統?

日志系統是用于記錄程序在運行過程中的各種事件和信息的一套機制。
通過日志,我們可以了解程序在什么時間、什么地方、發生了什么,以及是否發生了錯誤。

簡單理解,日志就像你寫日記,程序每天都在告訴你:“我做了什么”,“我哪里出錯了”。

日志通常包括以下內容:
  • 時間戳(事件發生的時間)

  • 日志級別(信息的嚴重程度,如 INFO、ERROR)

  • 類名或線程名(哪個部分打印的)

  • 具體的消息(發生了什么)

例如,一條典型的日志可能長這樣:

2025-04-11 10:30:15.123  INFO 12345 --- [ main] com.example.demo.DemoApp : 應用啟動成功

🔧 常見的日志框架介紹

Java 世界中,有很多日志框架。我們常用的主要有四種角色:


1. Java Util Logging(JUL)
  • Java 自帶的日志框架,包名是 java.util.logging

  • 優點:內置,無需引入依賴。

  • 缺點:功能簡單,不夠靈活,擴展性差,格式不夠直觀。

  • 用得越來越少,大型項目基本不用它。


2. Log4j / Log4j2
  • Log4j 是 Apache 提供的經典日志框架,功能強大,配置靈活。

  • Log4j2 是 Log4j 的升級版,性能更好,支持異步日志、高并發。

  • 注意:Log4j 1.x 存在安全漏洞(Log4Shell),已被淘汰,推薦使用 Log4j2。

  • 使用 Log4j2 時需要排除 Spring Boot 默認的 Logback,再手動配置依賴。


3. SLF4J(Simple Logging Facade for Java)【日志門面】
  • SLF4J 不是日志框架,而是一個 日志“門面”,像一個“統一的接口”。

  • 作用:屏蔽底層實現的差異,讓你可以自由切換 Logback、Log4j 等實現。

  • 使用方式:

    private static final Logger logger = LoggerFactory.getLogger(MyClass.class);
    logger.info("Hello, log!");
    
  • 好處:項目中只依賴 SLF4J,不綁定具體實現,解耦 + 靈活。


4. Logback(默認實現)
  • Logback 是由 Log4j 的作者開發的新一代日志框架,性能更優。

  • Spring Boot 默認使用 Logback 作為日志實現。

  • 支持控制臺、文件、多種格式的日志輸出。

  • 和 Spring Boot 配合得非常好,擴展性強。


🎯 總結

角色名稱說明
日志接口SLF4J日志門面,統一 API
日志實現LogbackSpring Boot 默認,推薦
其他實現Log4j2高性能替代品,需手動替換
系統自帶JUL不推薦,過于簡單

三、Spring Boot 默認日志配置

Spring Boot 之所以深受歡迎,其中一個原因就是它對日志的默認配置開箱即用,開發者可以無需任何額外設置就能看到格式良好的日志輸出。下面我們來詳細看看它默認是怎么做的。


? Spring Boot 默認使用的日志框架(Logback + SLF4J)

Spring Boot 默認集成了兩個日志相關的庫:

  1. SLF4J:日志門面,提供統一的日志接口。

  2. Logback:默認的底層實現,用于實際輸出日志。

這意味著你在寫代碼時使用的是 SLF4J 提供的統一 API,比如:

private static final Logger logger = LoggerFactory.getLogger(MyClass.class);logger.info("系統啟動成功!");

而最終控制臺看到的輸出,其實是由 Logback 處理并輸出的。

💡 不需要手動添加依賴,這些默認都由 Spring Boot Starter 自動幫你配置好了。


💻 控制臺輸出的日志格式說明

Spring Boot 啟動時你會看到類似這樣的日志輸出:

2025-04-11 10:25:31.456  INFO 12345 --- [  main] com.example.demo.DemoApplication : Started DemoApplication in 3.456 seconds

這行日志可以拆解成幾個部分:

部分含義
2025-04-11 10:25:31.456時間戳
INFO日志級別
12345線程 ID(或者進程 ID)
--- [ main]當前線程名稱
com.example.demo.DemoApplication打印日志的類
: Started DemoApplication...實際輸出的信息

這些格式由 Logback 的默認配置定義,你可以通過自定義 logback-spring.xml 來修改它。


🧱 默認日志級別說明(從低到高)

日志級別用于區分日志的重要程度,Spring Boot(Logback)默認支持以下幾個級別:

級別說明使用場景
TRACE最細的日志級別一般用于調試時跟蹤方法調用過程
DEBUG調試信息開發過程中用于查看變量值、流程走向等
INFO普通信息系統正常運行的重要提示,如啟動成功
WARN警告信息表示可能存在問題,但不影響正常運行
ERROR錯誤信息程序出現異常或功能出錯

🔽 默認輸出級別是 INFO 及以上,也就是說你寫的 debug()trace() 日志默認是看不到的,除非你手動設置級別為 DEBUG。


示例:設置為 DEBUG 日志級別

你可以在 application.properties 中這樣配置,讓項目打印更多調試信息:

logging.level.root=DEBUG

或者針對某個包:

logging.level.com.example=DEBUG

這樣可以避免日志太多,控制只打印你關注的部分代碼的調試信息。


四、如何自定義日志配置

雖然 Spring Boot 默認日志配置就夠用,但實際開發中我們往往希望控制日志級別、格式、輸出位置,甚至輸出到文件或遠程系統。下面就來手把手教你怎么自定義這些設置。


1?? 修改日志級別

Spring Boot 支持通過配置文件修改日志的輸出級別,既可以全局設置,也可以針對某個包或類設置。

? 在 application.properties 中配置:
# 設置全局日志級別為 DEBUG
logging.level.root=DEBUG# 單獨為指定包設置為 DEBUG,其它保持 INFO
logging.level.com.example.myapp=DEBUG
? 在 application.yml 中配置:
logging:level:root: INFOcom.example.myapp: DEBUG

💡 小貼士:開發環境建議 DEBUG,生產環境建議 INFO 或 WARN,避免日志太多影響性能。


2?? 自定義日志格式

如果你不喜歡默認的控制臺格式,或者想輸出更多內容(如線程名、類名、方法名等),可以創建一個自定義的配置文件。

📝 創建 logback-spring.xml 文件(放在 resources/ 目錄下)
<?xml version="1.0" encoding="UTF-8"?>
<configuration><!-- 控制臺輸出 --><appender name="Console" class="ch.qos.logback.core.ConsoleAppender"><encoder><!-- pattern 為日志格式 --><pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern></encoder></appender><!-- 根日志配置 --><root level="INFO"><appender-ref ref="Console" /></root></configuration>
常見配置項說明:
配置項說明
pattern日志輸出格式(時間、線程、級別、類名、消息)
appender輸出目標,比如 Console、File 等
logger針對某個類或包配置的日志
root根日志,默認應用于所有包

3?? 輸出日志到文件

默認 Spring Boot 日志只輸出到控制臺,如果你想將日志保存到本地文件中,可以用 RollingFileAppender 實現。

🔁 輸出到文件并支持按大小或時間歸檔:
<appender name="FileAppender" class="ch.qos.logback.core.rolling.RollingFileAppender"><file>logs/app.log</file><!-- 日志滾動策略:按天切割 --><rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"><!-- 文件名格式:logs/app-2025-04-11.log --><fileNamePattern>logs/app-%d{yyyy-MM-dd}.log</fileNamePattern><!-- 最大保留 30 天 --><maxHistory>30</maxHistory></rollingPolicy><encoder><pattern>%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{36} - %msg%n</pattern></encoder>
</appender><!-- 根日志同時輸出到控制臺和文件 -->
<root level="INFO"><appender-ref ref="Console" /><appender-ref ref="FileAppender" />
</root>

🔐 日志歸檔策略建議

策略類型說明
按時間歸檔TimeBasedRollingPolicy,常用于按天/月切割
按大小歸檔SizeBasedTriggeringPolicy,適合高并發項目
限制日志數量maxHistory 控制最多保留幾天的日志
限制文件大小totalSizeCap 可限制整個日志目錄大小

🔚 小結

  • 使用 application.properties 配置簡單快捷,適合設置日志級別;

  • logback-spring.xml 能夠精細控制輸出格式和目標,適合復雜需求;

  • 文件輸出和歸檔非常適合生產環境,有助于長期追蹤和問題排查。


下面是為你準備的兩個日志配置模板,分別適用于:

  • 🛠 開發環境(dev):日志詳細、方便調試;

  • 🚀 生產環境(prod):日志適度、重點關注問題和性能。

這兩個配置文件可以分別命名為:

logback-dev.xml
logback-prod.xml

并通過 Spring Boot 的多環境配置機制切換,比如:

# application-dev.properties
spring.profiles.active=dev# application-prod.properties
spring.profiles.active=prod

? 開發環境日志配置(logback-dev.xml)

<?xml version="1.0" encoding="UTF-8"?>
<configuration><property name="LOG_PATH" value="logs/dev"/><appender name="Console" class="ch.qos.logback.core.ConsoleAppender"><encoder><pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern></encoder></appender><appender name="File" class="ch.qos.logback.core.rolling.RollingFileAppender"><file>${LOG_PATH}/dev.log</file><rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"><fileNamePattern>${LOG_PATH}/dev-%d{yyyy-MM-dd}.log</fileNamePattern><maxHistory>7</maxHistory></rollingPolicy><encoder><pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern></encoder></appender><!-- 開發環境 DEBUG 級別 --><root level="DEBUG"><appender-ref ref="Console"/><appender-ref ref="File"/></root></configuration>

? 生產環境日志配置(logback-prod.xml)

<?xml version="1.0" encoding="UTF-8"?>
<configuration><property name="LOG_PATH" value="logs/prod"/><appender name="Console" class="ch.qos.logback.core.ConsoleAppender"><encoder><pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} %-5level [%thread] %logger{36} - %msg%n</pattern></encoder></appender><appender name="File" class="ch.qos.logback.core.rolling.RollingFileAppender"><file>${LOG_PATH}/prod.log</file><rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"><fileNamePattern>${LOG_PATH}/prod-%d{yyyy-MM-dd}.log</fileNamePattern><maxHistory>30</maxHistory><totalSizeCap>1GB</totalSizeCap></rollingPolicy><encoder><pattern>%d{yyyy-MM-dd HH:mm:ss} %-5level [%thread] %logger{36} - %msg%n</pattern></encoder></appender><!-- 生產環境 INFO 起步,避免太多無用日志 --><root level="INFO"><appender-ref ref="Console"/><appender-ref ref="File"/></root></configuration>

💡 使用方法:

將這兩個 XML 文件放到 resources/ 目錄下,并命名為:

  • logback-spring.xml(用于默認環境)

  • 或結合 profile 使用:logback-dev.xml, logback-prod.xml

你也可以在配置文件中顯式指定要使用的日志文件:

logging.config=classpath:logback-dev.xml

五、實用技巧與最佳實踐

寫日志不是隨便 System.out.println(),而是一種規范的技能。好的日志能幫你救命,壞的日志只會制造更多混亂。這一節就來教你怎么寫“聰明”的日志。


1?? 使用占位符語法(推薦寫法)

🚫 錯誤示例(不要這樣):

logger.info("User id: " + userId);

? 正確示例(推薦):

logger.info("User id: {}", userId);

為什么?

  • 性能更好:如果當前日志級別低于 info,userIdtoString() 都不會被執行,減少性能浪費;

  • 更安全:日志系統會自動格式化參數,避免亂碼和拼接錯誤;

  • 更整潔:日志模板更清晰、統一。


2?? 不要在生產環境打開 DEBUG 或 TRACE

DEBUG 和 TRACE 會輸出大量日志,在生產環境可能導致:

  • 日志文件暴漲,占滿磁盤

  • 日志查閱困難,關鍵信息被埋沒

  • 性能下降(尤其是在高并發系統中)

? 推薦做法:

  • 開發階段使用 DEBUG

  • 測試階段使用 INFO

  • 上線部署時設置為 INFOWARN,只記錄關鍵事件和錯誤。

# application-prod.properties
logging.level.root=INFO

3?? 日志中避免打印敏感信息

日志一旦暴露給外部人員,可能泄露用戶隱私和系統安全信息。

🚫 千萬不要這樣做:

logger.info("登錄成功,密碼為:{}", password);
logger.debug("Token: {}", accessToken);

? 推薦做法:

  • 脫敏或打碼:只保留前后幾位

  • 提示性信息:避免原文出現

logger.info("用戶 {} 登錄成功", username);
logger.warn("檢測到異常登錄行為,token 已隱藏");

4?? 區分 dev/test/prod 環境日志配置

開發環境和生產環境的日志需求完全不同,建議使用 Spring Boot 的多 profile 特性,為每個環境配置專屬日志策略:

🛠 開發環境(dev):
  • 日志級別:DEBUG

  • 輸出位置:控制臺 + 日志文件

  • 格式詳細,便于排查 bug

? 生產環境(prod):
  • 日志級別:INFO 或 WARN

  • 輸出位置:日志文件

  • 日志歸檔:按天/大小切割,保留30天

  • 禁止輸出敏感數據

配置方式:

# application.properties
spring.profiles.active=prod

結合 logback-spring.xml 使用 <springProfile> 標簽:

<springProfile name="dev"><!-- 開發環境日志配置 -->
</springProfile><springProfile name="prod"><!-- 生產環境日志配置 -->
</springProfile>

?🆚 錯誤日志 vs 優雅日志(對比示例)

這一塊可以放在博客中作為視覺亮點,幫助讀者立刻理解“什么叫寫好日志”。

📌 示例對比表:

? 錯誤寫法? 優雅寫法原因說明
logger.info("User login: " + userId);logger.info("User login: {}", userId);使用占位符,避免不必要的字符串拼接
logger.debug("Token=" + token);logger.debug("Token received, length: {}", token.length());不打印敏感信息原文,輸出摘要信息即可
logger.error("Exception occurred: " + e.getMessage());logger.error("Exception during processing", e);推薦直接傳 Throwable 對象,堆棧信息更完整
System.out.println("User created");logger.info("User {} created", username);不建議使用 System.out,使用日志框架更規范
logger.debug("Step 1"); logger.debug("Step 2");logger.debug("Processing user {}, step {}", userId, step);多條日志合并為有結構的信息,方便追蹤
logger.trace("enter function");logger.trace("Enter: {}()", methodName);日志上下文更清楚,方便排查邏輯流程


🔚 小結

技巧原因
使用占位符性能更好,結構更清晰
避免拼接日志不必要的計算,浪費資源
不打印敏感信息保證安全合規
不開 DEBUG 在生產減少無效日志,保護系統性能
多環境配置按需記錄,控制信息量

六、整合其他日志框架(如使用 Log4j2)

🛠 替換默認 Logback 為 Log4j2

Spring Boot 默認使用 Logback,但如果你想使用 Log4j2,需要做一些配置和依賴調整。

1?? 添加 Log4j2 相關依賴

首先,去掉默認的 Logback 依賴,然后引入 Log4j2 相關的依賴。

pom.xml(如果是 Maven 項目):

<dependencies><!-- 排除 Spring Boot 默認的 Logback --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-logging</artifactId><scope>provided</scope></dependency><!-- 添加 Log4j2 的依賴 --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-log4j2</artifactId></dependency>
</dependencies>

build.gradle(如果是 Gradle 項目):

dependencies {// 排除默認的 Logbackimplementation('org.springframework.boot:spring-boot-starter-logging') {exclude group: 'org.springframework.boot', module: 'spring-boot-starter-logging'}// 添加 Log4j2 依賴implementation 'org.springframework.boot:spring-boot-starter-log4j2'
}

2?? 配置 Log4j2 文件

Spring Boot 默認會自動識別 log4j2.xml 配置文件,所以你需要在 resources/ 目錄下創建 log4j2.xml 文件,進行自定義配置。

log4j2.xml(示例配置):

<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="WARN"><!-- 定義日志輸出的格式 --><Appenders><!-- 控制臺輸出 --><Console name="Console" target="SYSTEM_OUT"><PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss} %-5level %logger{36} - %msg%n" /></Console><!-- 文件輸出 --><RollingFile name="File" fileName="logs/app.log" filePattern="logs/app-%d{yyyy-MM-dd}.log"><PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss} %-5level %logger{36} - %msg%n" /><Policies><TimeBasedTriggeringPolicy interval="1" modulate="true"/></Policies></RollingFile></Appenders><!-- 配置日志級別 --><Loggers><!-- 根日志級別 --><Root level="INFO"><AppenderRef ref="Console" /><AppenderRef ref="File" /></Root></Loggers></Configuration>

這個配置文件設置了兩種輸出方式:

  • 控制臺輸出(Console

  • 文件輸出(RollingFile),日志文件按日期滾動保存


3?? 注意事項:依賴沖突與排除默認依賴

  • 依賴沖突:Spring Boot 默認會包含 Logback 相關的依賴(如 spring-boot-starter-logging),如果你添加了 spring-boot-starter-log4j2,則需要排除默認的 Logback 依賴,否則會引發依賴沖突,導致應用啟動失敗。

  • 排除默認依賴:正如前面所示,Maven 或 Gradle 中需要排除 spring-boot-starter-logging,這樣 Spring Boot 就不會再自動配置 Logback。

  • 版本兼容性:確保 Log4j2 的版本與 Spring Boot 版本兼容。Spring Boot 默認的 Log4j2 版本是 2.x,而 Log4j 1.x 版本與 Spring Boot 不兼容。


4?? 日志級別和輸出格式

你可以根據需要靈活調整日志級別和輸出格式,比如將日志級別設置為 DEBUGWARN,控制不同包和類的日志輸出:

<Loggers><Logger name="org.springframework.web" level="DEBUG" additivity="false"><AppenderRef ref="Console"/></Logger>
</Loggers>

這個配置將 org.springframework.web 包的日志級別設置為 DEBUG,并輸出到控制臺。


🔚 小結

  • 替換默認 Logback 為 Log4j2 的步驟:

    1. 排除默認的 Logback 依賴;

    2. 引入 spring-boot-starter-log4j2

    3. 配置 log4j2.xml

    4. 注意依賴沖突,排除默認日志。

  • Log4j2 的優勢:性能高、配置靈活、功能豐富(如異步日志、日志歸檔等)。


七、查看日志的常用工具

1?? 使用 tail 命令查看日志文件

在 Linux 或 macOS 系統中,tail 是查看日志文件的非常方便的工具,尤其適用于實時監控日志輸出。你可以通過命令行直接查看日志文件內容,常用于生產環境中排查問題。

基本用法
  • 查看日志文件的最后 10 行:

tail -n 10 logs/app.log
  • 實時跟蹤日志(類似于“實時輸出”):

tail -f logs/app.log
  • 查看文件內容并輸出新增內容(tail -f 可以看到日志實時更新):

tail -f logs/app.log | grep "ERROR"
  • 查看日志文件最后 N 行并同時輸出新增內容:

tail -n 100 -f logs/app.log

2?? 使用 Spring Boot Admin 查看日志

Spring Boot Admin 是一個用于監控 Spring Boot 應用的開源項目,它允許你通過一個圖形化界面查看和管理多個 Spring Boot 應用的日志。

集成 Spring Boot Admin
  1. 添加 Spring Boot Admin 依賴

在你的 Spring Boot 項目中,添加 Spring Boot Admin 的依賴。

pom.xml(Maven)

<dependencies><dependency><groupId>de.codecentric</groupId><artifactId>spring-boot-admin-starter-server</artifactId><version>2.6.0</version> <!-- 選擇與 Spring Boot 兼容的版本 --></dependency>
</dependencies>
  1. 啟用 Spring Boot Admin 服務器

在主類(@SpringBootApplication 的類)上添加 @EnableAdminServer 注解。

import de.codecentric.boot.admin.server.config.EnableAdminServer;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;@SpringBootApplication
@EnableAdminServer
public class AdminServerApplication {public static void main(String[] args) {SpringApplication.run(AdminServerApplication.class, args);}
}
  1. 配置應用連接到 Spring Boot Admin 服務器

在客戶端應用(即你要監控的 Spring Boot 應用)中,添加 Spring Boot Admin 的客戶端依賴:

pom.xml(Maven)

<dependencies><dependency><groupId>de.codecentric</groupId><artifactId>spring-boot-admin-starter-client</artifactId><version>2.6.0</version> <!-- 選擇與 Spring Boot 兼容的版本 --></dependency>
</dependencies>
  1. 配置 Spring Boot Admin 客戶端

application.propertiesapplication.yml 中添加以下配置,連接到 Spring Boot Admin 服務器:

spring.boot.admin.client.url=http://localhost:8080
  1. 訪問 Spring Boot Admin 界面

啟動 Spring Boot Admin 服務器后,訪問界面 URL(例如:http://localhost:8080)即可查看所有注冊的 Spring Boot 應用的信息,包括日志、健康檢查、性能指標等。


3?? 使用 ELK 堆棧查看日志

ELK(Elasticsearch, Logstash, Kibana)是一個強大的日志管理和分析工具,適用于大規模分布式應用。通過 ELK 堆棧,你可以集中收集、存儲和分析日志數據,并通過 Kibana 提供的圖形界面進行實時查詢和可視化分析。

ELK 堆棧概述
  • Elasticsearch:搜索和分析引擎,用于存儲日志數據。

  • Logstash:日志收集和處理工具,負責將日志數據從各種來源(如文件、數據庫、消息隊列等)傳輸到 Elasticsearch。

  • Kibana:前端可視化工具,提供圖形化界面用于查詢和展示 Elasticsearch 中的日志數據。

集成 ELK 堆棧
  1. 安裝和啟動 ELK

你可以通過 Docker 快速啟動 ELK 堆棧(Elasticsearch、Logstash、Kibana):

docker-compose up -d
  1. 配置 Logstash

在 Logstash 中配置輸入(Input)、過濾(Filter)和輸出(Output),例如:

input {file {path => "/path/to/your/logs/*.log"start_position => "beginning"}
}filter {# 可以添加一些過濾規則,如解析 JSON 或解析日志格式
}output {elasticsearch {hosts => ["http://localhost:9200"]index => "springboot-logs-%{+YYYY.MM.dd}"}
}
  1. 訪問 Kibana

Kibana 提供了一個 Web UI,訪問 http://localhost:5601,可以通過 Kibana 查詢、可視化日志,并設置儀表盤來監控日志。

ELK 優勢
  • 強大的搜索與分析功能:支持復雜的查詢與實時分析,適合大規模日志數據的分析。

  • 實時可視化:Kibana 提供豐富的圖表、表格和儀表盤,可快速發現日志中的趨勢、異常和潛在問題。

  • 日志聚合:支持多種數據源的聚合、過濾和分析,幫助開發和運維人員更高效地處理日志數據。


🔚 小結

工具描述優勢
tail 命令實時查看日志文件簡單、快速、適合命令行用戶
Spring Boot Admin圖形化監控 Spring Boot 應用的日志易于配置、集中管理、支持健康檢查和性能監控
ELK 堆棧高效的日志收集、存儲和可視化工具強大的查詢和可視化功能,適合大規模日志數據

八、實戰演示

1?? 創建一個簡單的 Spring Boot 項目

如果你還沒有 Spring Boot 項目,可以通過 Spring Initializr 快速創建一個。

  • 訪問 Spring Initializr,選擇如下配置:

    • Project: Maven Project

    • Language: Java

    • Spring Boot Version: 2.x(選擇當前最新版本)

    • Project Metadata:

      • Group: com.example

      • Artifact: logdemo

      • Name: logdemo

      • Packaging: Jar

      • Java: 11 或以上

    • Dependencies: Spring Web

點擊 Generate 下載生成的 ZIP 文件,然后解壓并導入到 IDE 中。


2?? 配置日志輸出到控制臺和文件

在 Spring Boot 中,默認的日志框架是 Logback。你可以通過配置文件(如 application.propertiesapplication.yml)來自定義日志的輸出方式和格式。這里我們將展示如何將日志同時輸出到控制臺和文件。

使用 application.properties 配置

src/main/resources/application.properties 文件中添加以下配置:

# 配置日志級別為 INFO
logging.level.root=INFO# 配置日志格式和輸出位置
logging.pattern.console=%d{yyyy-MM-dd HH:mm:ss} - %-5level - %logger{36} - %msg%n
logging.pattern.file=%d{yyyy-MM-dd HH:mm:ss} - %-5level - %logger{36} - %msg%n# 配置日志文件輸出路徑和文件名
logging.file.name=logs/app.log
logging.file.max-size=10MB
logging.file.max-history=30
解釋配置項:
  • logging.level.root=INFO:設置日志級別為 INFO,表示 INFO 及更高級別的日志會被輸出。

  • logging.pattern.console:控制臺日志輸出的格式。

  • logging.pattern.file:文件日志輸出的格式。

  • logging.file.name:指定日志文件的路徑和名稱。

  • logging.file.max-size:設置日志文件的最大大小,達到該大小后會進行日志文件切割。

  • logging.file.max-history:指定日志文件保留的最大歷史文件數。

這樣配置后,Spring Boot 會將日志輸出到控制臺和 logs/app.log 文件中,且文件會按大小進行滾動。


3?? 示例代碼:如何正確使用 Logger

在 Spring Boot 項目中,我們通常使用 SLF4J 與 Logback 集成,通過 Logger 接口來記錄日志。SLF4J 提供了一個統一的日志接口,能夠與多種日志框架(如 Logback、Log4j2)兼容。

在類中使用 Logger
  1. 創建一個簡單的 Controller 來測試日志輸出

src/main/java/com/example/logdemo 目錄下,創建一個 HelloController.java 類,并在其中使用 Logger。

package com.example.logdemo;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 HelloController {// 獲取 Logger 實例private static final Logger logger = LoggerFactory.getLogger(HelloController.class);@GetMapping("/hello")public String sayHello() {// 使用不同級別的日志logger.trace("This is a TRACE level log");logger.debug("This is a DEBUG level log");logger.info("This is an INFO level log");logger.warn("This is a WARN level log");logger.error("This is an ERROR level log");return "Hello, Spring Boot Logging!";}
}
解釋:
  • LoggerFactory.getLogger(HelloController.class):通過 SLF4J 獲取日志記錄器實例,HelloController.class 是日志記錄的上下文,可以根據類名動態生成日志。

  • 不同的日志級別:我們在 sayHello 方法中演示了如何使用不同的日志級別:TRACEDEBUGINFOWARNERROR

  • 這些日志信息將按照在 application.properties 中配置的格式輸出到控制臺和日志文件。


4?? 運行應用并查看日志輸出

啟動 Spring Boot 應用

在 IDE 中運行 LogdemoApplication.java 類(或者通過命令行使用 mvn spring-boot:run 啟動應用)。

訪問接口并查看日志輸出
  • 打開瀏覽器或使用 Postman,訪問 http://localhost:8080/hello

  • 訪問時,控制臺和 logs/app.log 文件中會輸出不同級別的日志。

示例控制臺輸出:
2025-04-11 15:30:12 - INFO  - com.example.logdemo.HelloController - This is an INFO level log
2025-04-11 15:30:12 - WARN  - com.example.logdemo.HelloController - This is a WARN level log
2025-04-11 15:30:12 - ERROR - com.example.logdemo.HelloController - This is an ERROR level log
示例日志文件輸出:

日志文件 logs/app.log 會記錄類似以下的內容:

2025-04-11 15:30:12 - INFO  - com.example.logdemo.HelloController - This is an INFO level log
2025-04-11 15:30:12 - WARN  - com.example.logdemo.HelloController - This is a WARN level log
2025-04-11 15:30:12 - ERROR - com.example.logdemo.HelloController - This is an ERROR level log

5?? 如何調整日志級別

你可以通過修改 application.properties 文件中的 logging.level 配置來動態改變日志級別。

例如,想要在開發環境中輸出 DEBUG 級別的日志,可以在 application.properties 中進行配置:

logging.level.com.example.logdemo.HelloController=DEBUG

這會將 HelloController 類的日志級別調整為 DEBUG,并輸出更多的日志信息。


🔚 小結

  • 日志配置:通過 application.properties 可以簡單配置日志的輸出格式和文件路徑,Spring Boot 默認支持 Logback。

  • Logger 使用:通過 SLF4J 提供的 Logger 接口可以方便地記錄不同級別的日志。

  • 日志文件和控制臺輸出:日志不僅會輸出到控制臺,還會根據配置輸出到文件中,支持文件滾動和歷史保留。


九、總結與推薦閱讀

📝 總結:日志的作用與配置重點

在現代的應用程序中,日志是非常重要的一部分。無論是開發階段的調試,還是生產環境中的問題追蹤,日志都能提供重要的線索。日志的好壞直接影響到開發和運維的效率。

日志的作用
  • 問題排查:日志是定位問題、分析應用運行狀態的重要工具。通過查看日志,可以快速找到應用出現問題的根源。

  • 性能監控:日志可以幫助我們分析應用的性能瓶頸,比如接口響應時間、數據庫查詢時間等。

  • 安全審計:通過日志記錄用戶操作和系統事件,幫助檢測異常操作和潛在的安全問題。

  • 應用健康監控:結合 Spring Boot Admin 或 ELK 等工具,我們可以實現應用的實時監控,及時發現應用狀態的異常。

日志配置重點
  • 日志級別:合理配置日志級別(TRACE、DEBUG、INFO、WARN、ERROR)非常重要,過多的日志會影響性能,而過少的日志則可能無法及時發現問題。

  • 輸出目標:Spring Boot 默認的 Logback 支持將日志輸出到控制臺和文件,文件輸出支持日志滾動和歸檔策略。

  • 日志格式:通過配置日志輸出的格式,可以讓日志更加易于閱讀和分析。常見的做法是添加時間戳、日志級別、類名、方法名等信息。

  • 日志文件管理:配置日志文件的大小限制和歷史日志的保存策略,避免日志文件無限增長。

📚 推薦閱讀

為了幫助你更好地理解日志框架的選擇和使用,下面是一些推薦的資料:

1?? 官方文檔鏈接
  • Spring Boot 官方文檔:https://docs.spring.io/spring-boot/docs/current/reference/html/features.html#features.logging

    • Spring Boot 文檔中詳細介紹了如何配置日志,包含不同配置方式、日志框架的選擇及使用。

  • Logback 官方文檔:Documentation

    • 了解 Logback 框架的配置細節、日志輸出格式和高級特性。

  • SLF4J 官方文檔:SLF4J Manual

    • SLF4J 是一個日志門面,支持多種日志框架的兼容,適用于不同的日志實現。

  • Log4j 2 官方文檔:Manual :: Apache Log4j

    • 如果你選擇 Log4j2,Apache 提供的官方文檔能夠幫助你深入了解 Log4j2 的各種特性和配置。

2?? SLF4J vs Log4j vs Logback 簡析
  • SLF4J 是一個日志門面,提供統一的日志接口,支持不同的日志實現。它本身不提供日志記錄的實現,而是通過其他日志框架(如 Logback 或 Log4j)進行處理。

  • Logback 是一個高性能的日志框架,是 SLF4J 的原生實現,并且作為 Spring Boot 默認的日志框架。它提供了靈活的日志配置、日志滾動、異步日志等高級功能。

  • Log4j(尤其是 Log4j2)是一個流行的日志框架,它提供了比 Logback 更豐富的特性,尤其在性能和靈活性方面有顯著優勢。Log4j2 支持異步日志、配置的自動更新等。

  • 比較分析

    • 性能:Log4j2 相比 Logback 提供了更高的性能,尤其在多線程環境中。

    • 功能:Log4j2 提供的異步日志、日志聚合、配置自動更新等功能更加靈活。

    • 使用:Logback 相對簡單且與 Spring Boot 的集成非常流暢,是默認推薦的日志框架。Log4j2 更適合對日志有特殊要求的大型應用。

3?? Spring Boot 實戰項目
  • 《Spring Boot 實戰》:一本非常經典的書籍,深入講解了 Spring Boot 的方方面面。書中不僅介紹了如何使用 Spring Boot 進行開發,還涵蓋了日志、監控等運維相關的內容。

    • Spring Boot 實戰 - 電子書鏈接

  • GitHub 上的 Spring Boot 示例項目:你可以參考一些開源項目,了解日志在實際項目中的使用。比如:

    • Spring Boot 示例項目

    • Spring Boot Admin 官方示例


🔚 結語

日志是軟件開發中的重要組成部分,它不僅是問題排查的關鍵工具,也是應用性能和健康監控的重要手段。在本文中,我們詳細探討了 Spring Boot 中日志的配置和最佳實踐,介紹了常見的日志框架(如 SLF4J、Logback、Log4j2)及其使用方法。

通過理解日志的作用和如何高效地管理日志輸出,你可以更好地監控應用的運行狀態,及時發現并解決潛在問題。同時,合理配置日志的級別、格式和輸出方式,能夠提高開發效率,減少因日志管理不當而帶來的困擾。

希望你能通過本篇文章對 Spring Boot 中的日志配置有一個清晰的認識,并能夠在自己的項目中靈活運用。如果你在日志的使用過程中遇到任何挑戰,或者希望深入學習更多內容,歡迎參考推薦的資料和進一步的探索。

日志配置是開發和運維工作的一項基礎技能,掌握它,將讓你的開發和運維工作更加高效、穩定。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/76476.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/76476.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/76476.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

IP協議之IP,ICMP協議

1.因特網中的主要協議是TCP/IP&#xff0c;Interneet協議也叫TCP/IP協議簇 2.ip地址用點分十進制表示&#xff0c;由32位的二進制表示&#xff0c;兩部分組成&#xff1a;網絡標識主機標識 3.IP地址分類; A:0.0.0.0-127.255.255.255 B&#xff1a;128.0.0.0-191.255.255.25…

GPIO_ReadInputData和GPIO_ReadInputDataBit區別

目錄 1、GPIO_ReadInputData: 2、GPIO_ReadInputDataBit: 總結 GPIO_ReadInputData 和 GPIO_ReadInputDataBit 是兩個函數&#xff0c;通常用于讀取微控制器GPIO&#xff08;通用輸入輸出&#xff09;引腳的輸入狀態&#xff0c;特別是在STM32系列微控制器中。它們之間的主要…

洛古B4158 [BCSP-X 2024 12 月小學高年級組] 質數補全(線性篩/dfs)

B4158 [BCSP-X 2024 12 月小學高年級組] 質數補全 - 洛谷 思路1:線性篩,字符串匹配,枚舉 質數篩選 要解決這個問題&#xff0c;首先得找出指定范圍內&#xff08;這里是 1 到 10000000&#xff09;的所有質數。常用的質數篩選算法有埃拉托斯特尼篩法&#xff08;埃氏篩&#…

一周學會Pandas2 Python數據處理與分析-Pandas2讀取Excel

鋒哥原創的Pandas2 Python數據處理與分析 視頻教程&#xff1a; 2025版 Pandas2 Python數據處理與分析 視頻教程(無廢話版) 玩命更新中~_嗶哩嗶哩_bilibili Excel格式文件是辦公使用和處理最多的文件格式之一&#xff0c;相比CSV文件&#xff0c;Excel是有樣式的。Pandas2提…

NVIDIA H100 vs A100:新一代GPU架構性能對比分析

一、核心架構演進對比 ?Ampere架構&#xff08;A100&#xff09;?采用臺積電7nm工藝&#xff0c;集成540億晶體管&#xff0c;配備6,912個CUDA核心和432個第三代Tensor Core&#xff0c;支持FP16、TF32和INT8精度計算。其顯存子系統采用HBM2e技術&#xff0c;80GB版本帶寬可…

保護PCBA的不同方法:噴三防漆 vs 鍍膜

PCBA&#xff08;印刷電路板組件&#xff09;的防護工藝中&#xff0c;噴三防漆和鍍膜&#xff08;如Parylene氣相沉積&#xff09;是兩種常見技 術。它們在防護目的上類似&#xff0c;但在具體實現方式和應用場景上有顯著差異。以下從外觀、工藝、性 能、物理性質和成本五個…

VitePress 項目部署 cloudflare page 提示 npm run build 錯誤

構建的錯誤信息如下&#xff1a; 09:52:57.975 ? YN0000: Done with warnings in 3s 120ms 09:52:58.072 Executing user command: npm run build 09:52:58.817 npm ERR! Missing script: "build" 09:52:58.818 npm ERR! 09:52:58.818 npm ERR! To see a list of …

C++學習之ORACLE③

1.集合運算符 查詢部門號是10和20的員工信息&#xff1a; &#xff1f;思考有幾種方式解決該問題 &#xff1f; SQL> select * from emp where deptno in(10, 20) SQL> select * from emp where deptno10 or deptno20 集合運算&#xff1a; Select * from emp …

人工智能之數學基礎:復矩陣

本文重點 復矩陣是線性代數中以復數為元素的矩陣,是實矩陣在復數域上的自然推廣。與實矩陣相比,復矩陣在數學性質、運算規則和應用場景上具有獨特性,尤其在量子力學、信號處理、控制理論等領域發揮關鍵作用。 復矩陣的定義與表示 定義:復矩陣指的是元素含有復數的矩陣。…

華清遠見成都中心嵌入式學習總結

一、Linux 基礎入門 課程首先介紹了 Linux 系統的六大特性&#xff0c;包括開源、免費、可裁剪等核心優勢。重點講解了文件系統結構&#xff0c;強調根目錄&#xff08;/&#xff09;作為唯一入口的樹狀結構。通過實操學習了 pwd、ls、cd 等基礎命令&#xff0c;掌握了絕對路徑…

linux安裝ollama

倆種方式都可 一、linux通過docker安裝ollama鏡像 1.下載安裝ollama鏡像 # 安裝 Docker sudo yum install docker sudo systemctl start docker#docker查看所有容器 docker ps -a # 查看所有容器# docker查看指定容器 docker ps -a |grep ollama# 創建模型存儲目錄&#xff…

Redis 學習目標

&#x1f3af; Redis 學習目標&#xff08;開發者視角&#xff09; ? 一、學習完成后能掌握的核心能力&#xff1a; 分類具體內容&#x1f4e6; 基礎能力熟練掌握 Redis 五大數據結構&#xff08;String、List、Hash、Set、ZSet&#xff09;&#xff0c;會用也會選對場景&am…

gerrit配置及使用git-lfs

gerrit服務器端配置 下載git-lfs插件 登錄Dashboard [Jenkins] (gerritforge.com)&#xff0c;下載對應版本的插件 配置gerrit 將下載的lfs.jar插件放到${GERRIT_SITE}/plugins/下面為所有倉庫啟用git-lfs 此步驟需要修改 All-projects 倉庫配置&#xff0c;步驟如下 1、克隆倉…

深入理解 Linux PATH 環境變量:配置與優化!!!

深入理解 Linux PATH 環境變量&#xff1a;配置與優化 &#x1f680; 歡迎來到 Linux 環境變量的奇妙世界&#xff01;今天我們來聊聊那個讓命令行如魚得水的幕后英雄——PATH 環境變量&#xff01;&#x1f60e; 通過這篇博客&#xff0c;你將學會如何配置它、優化它&#xff…

如何在AMD MI300X 服務器上部署 DeepSeek R1模型?

DeepSeek-R1憑借其深度推理能力備受關注&#xff0c;在語言模型性能基準測試中可與頂級閉源模型匹敵。 AMD Instinct MI300X GPU可在單節點上高效運行新發布的DeepSeek-R1和V3模型。 用戶通過SGLang優化&#xff0c;將MI300X的性能提升至初始版本的4倍&#xff0c;且更多優化將…

簡化DB操作:Golang 通用倉庫模式

介紹 本代碼包提供一個用于數據庫操作的通用倉庫 (GenericRepository)&#xff0c;利用 Golang 和 GORM (Go ORM) 實現。該倉庫設計用于簡化數據庫的 CRUD (創建、讀取、更新、刪除) 操作&#xff0c;支持批處理、沖突處理、分頁查詢等高級功能。 主要功能 創建記錄 (Create…

JavaWeb 課堂筆記 —— 08 請求響應

本系列為筆者學習JavaWeb的課堂筆記&#xff0c;視頻資源為B站黑馬程序員出品的《黑馬程序員JavaWeb開發教程&#xff0c;實現javaweb企業開發全流程&#xff08;涵蓋SpringMyBatisSpringMVCSpringBoot等&#xff09;》&#xff0c;章節分布參考視頻教程&#xff0c;為同樣學習…

雙引擎驅動:解密音視頻體驗的QoS技術底座與QoE感官革命

QoS 定義&#xff1a;QoS&#xff08;Quality of Service&#xff0c;服務質量&#xff09;衡量音視頻傳輸技術層面的性能表現&#xff0c;聚焦網絡傳輸和系統處理能力&#xff0c;通過客觀指標量化服務質量。核心指標 碼率/帶寬&#xff1a;數據傳輸速率上限&#xff0c;直接…

Stable Diffusion + Contronet,調參實現LPIPS最優(帶生成效果+指標對比)——項目學習記錄

目錄 前言 一、數據集&#xff1a;圖像文本&#xff0c;部分選取于DeepFashion 二、優化一&#xff0c;img2img 三、優化二&#xff0c;微調sd參數 四、優化三&#xff0c;dreamshaper優化 五、優化四&#xff0c;sdv1.5contronet 六、問題探索歷程 1. 從 SDXL 到輕量化模…

SQL 不走索引的常見情況

在 SQL 查詢中&#xff0c;即使表上有索引&#xff0c;某些情況下數據庫優化器也可能決定不使用索引。以下是常見的不走索引的情況&#xff1a; 1. 使用否定操作符 NOT IN ! 或 <> NOT EXISTS NOT LIKE 2. 對索引列使用函數或運算 -- 不走索引 SELECT * FROM user…