【生產就曲篇】讓應用可觀測:Actuator監控端點與日志最佳實踐

摘要

本文是《Spring Boot 實戰派》系列的終章,我們將探討如何讓應用真正達到**“生產就緒” (Production-Ready)** 的標準。文章的核心是可觀測性 (Observability),即從外部了解一個系統內部運行狀態的能力。

我們將深度挖掘 Spring Boot Actuator 的強大功能,學習如何開啟、暴露和保護其豐富的監控端點(如 health, metrics, info),為應用裝上實時的“儀表盤”。接著,我們將探討日志的最佳實踐,從如何有效配置日志級別和輸出到文件,到為什么要擁抱結構化日志 (JSON格式),以及它如何與 ELK、Loki 等現代日志聚合系統完美集成,為應用的“黑匣子”提供強大的事后追溯能力。

系列回顧:
經歷了九個章節的錘煉,我們從一個簡單的 “Hello World” 出發,一路披荊斬棘,為應用添加了數據持久化、安全認證、性能優化,并最終用 Docker 將其打包成一個標準的“集裝箱”。我們的應用現在功能強大、部署便捷。但是,當它被部署到黑漆漆的生產服務器上之后,它就成了一個“黑盒子”。它現在運行得還好嗎?內存占用高不高?數據庫連接池是否健康?昨晚那個偶發的錯誤到底是什么原因?

歡迎來到我們旅程的最后一站,也是通往專業運維和架構思維的第一站!

一個應用上線,不是結束,而是運維的開始。一個無法被有效監控和觀測的應用,就像一架沒有儀表盤的飛機,即使引擎再強大,飛行員也不敢將它飛上云霄。

可觀測性的三大支柱是:Metrics (指標)Logging (日志)Tracing (追蹤)。今天,我們將聚焦于前兩者,它們是 Spring Boot 應用最容易實現且效益最高的部分。

  1. Metrics (指標): 通過 Actuator 提供量化的、可聚合的數據,告訴我們應用**“怎么樣了”**。比如:CPU使用率、內存消耗、HTTP請求次數等。
  2. Logging (日志): 記錄離散的、帶有上下文的事件,告訴我們應用**“發生了什么”**。比如:一個用戶登錄成功、一個訂單創建失敗。

第一部分:應用的儀表盤 —— Spring Boot Actuator

Spring Boot Actuator 是一個子項目,它能為你的應用自動添加一系列用于監控和管理的生產級端點 (Endpoint)。我們只需要引入一個依賴,就能立刻獲得強大的內省能力。

1. 添加 Actuator 依賴

打開 my-first-app 項目的 pom.xml,添加以下依賴:

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-actuator</artifactId>
</dependency>

2. 開啟并暴露端點

默認情況下,出于安全考慮,Actuator 只會通過 JMX 暴露端點,并且在 Web 環境下只暴露 /health/info 兩個。我們需要在 application.properties (或對應的 profile 文件) 中修改配置,來通過 HTTP 暴露更多有用的端點。

# --- Actuator Settings ---# 暴露所有 Web 端點(在開發或內網環境中可以這樣做,生產環境需謹慎)
management.endpoints.web.exposure.include=*# 你也可以選擇性地暴露,更安全:
# management.endpoints.web.exposure.include=health,info,metrics,prometheus,env# 為 Actuator 端點啟用一個獨立的管理端口(可選,但推薦在生產中使用)
# management.server.port=9091# 顯示詳細的健康信息
management.endpoint.health.show-details=always# 為 info 端點添加自定義信息
info.app.name=@project.name@
info.app.description=@project.description@
info.app.version=@project.version@
  • @project.name@ 這些是 Maven 的資源過濾占位符,它會自動從 pom.xml 中讀取項目信息。確保你的 pom.xml<build> 標簽下有 <resources> 配置。

3. 探索核心端點

重啟你的應用(無論是通過 IDEA 還是 Docker),然后訪問以下 URL:

  • /actuator/health (健康檢查)

    • 訪問: http://localhost:8080/actuator/health
    • 作用: 這是最重要的端點,它會告訴你應用及其依賴(數據庫、Redis、磁盤空間等)的整體健康狀況。如果一切正常,返回 {"status":"UP"}。如果數據庫連不上,這里會顯示 DOWN,并給出詳細信息。負載均衡器和容器編排系統(如 Kubernetes)會頻繁調用此端點來決定是否將流量路由到該實例。
  • /actuator/info (應用信息)

    • 訪問: http://localhost:8080/actuator/info
    • 作用: 顯示我們在配置文件中定義的通用應用信息,如應用名、版本號。這對于在眾多微服務中快速識別當前應用非常有用。
  • /actuator/metrics (性能指標)

    • 訪問: http://localhost:8080/actuator/metrics
    • 作用: 列出所有可用的指標名稱。
    • 要查看具體指標,訪問 /actuator/metrics/{metricName},例如:
      • http://localhost:8080/actuator/metrics/jvm.memory.used: 查看 JVM 內存使用情況。
      • http://localhost:8080/actuator/metrics/http.server.requests: 查看 HTTP 請求的統計信息(如數量、總耗時)。
  • /actuator/prometheus (與 Prometheus 集成)

    • 作用: Actuator 可以與業界領先的監控系統 Prometheus 完美集成。此端點會以 Prometheus 支持的格式暴露所有指標。你只需要在 Prometheus 中配置抓取這個地址,就能擁有一個功能強大的監控告警平臺。
  • 其他常用端點:

    • /actuator/env: 查看所有環境變量和配置屬性。
    • /actuator/beans: 查看 Spring 容器中所有的 Bean。
    • /actuator/mappings: 查看所有 URL 路徑映射。

安全提示: 在生產環境中,Actuator 的端點可能泄露敏感信息。務必將其與主應用端口分離(使用 management.server.port),并通過 Spring Security 或網絡防火墻對其進行保護。


第二部分:應用的黑匣子 —— 日志最佳實踐

日志是排查線上問題的生命線。一條好的日志,應該告訴我們:“在什么時間,什么地點,誰,做了什么事,結果如何”

Spring Boot 默認使用 Logback 作為日志框架,我們的大部分工作都是在 application.properties 中完成配置。

1. 配置日志級別和輸出文件

# --- Logging Settings ---# 設置根日志級別
logging.level.root=INFO# 為特定的包設置更詳細的日志級別(便于開發調試)
logging.level.com.example.myfirstapp=DEBUG
logging.level.org.springframework.web=INFO
logging.level.org.hibernate.SQL=DEBUG # 打印 Hibernate 執行的 SQL# 配置日志輸出到文件
logging.file.name=logs/my-first-app.log# 日志文件達到 10MB 時進行滾動
logging.file.max-size=10MB
# 最多保留 7 天的日志文件
logging.file.max-history=7

通過這些配置,我們的日志不僅會顯示在控制臺,還會持久化到文件中,方便日后追溯。

2. 擁抱未來:結構化日志 (JSON)

傳統的文本日志(如 2023-11-20 10:30:00.123 INFO [main] ...)對人眼友好,但對機器極不友好。當你有成千上萬條日志時,你無法有效地對其進行搜索、過濾和聚合分析。

結構化日志通過將日志信息以 JSON 格式輸出,解決了這個問題。每一條日志都是一個 JSON 對象,包含時間戳、級別、線程名、消息以及自定義字段等。

為什么選擇 JSON 日志?

  • 機器可讀:Elasticsearch (ELK)Loki 這樣的日志聚合系統可以輕松地解析和索引 JSON。
  • 強大查詢: 你可以進行類似 SQL 的查詢,如 查詢所有 level="ERROR" 并且 userId="123" 的日志
  • 可視化: 可以在 Grafana、Kibana 等工具中創建炫酷的儀表盤,對日志數據進行可視化分析。

如何實現 JSON 日志?

我們需要引入一個 Logback 的擴展庫 logstash-logback-encoder

  • 添加依賴 (pom.xml):

    <dependency><groupId>net.logstash.logback</groupId><artifactId>logstash-logback-encoder</artifactId><version>7.4</version> <!-- 使用一個較新版本 -->
    </dependency>
    
  • 創建 logback-spring.xml 配置文件:
    src/main/resources 目錄下創建 logback-spring.xml。當這個文件存在時,Spring Boot 會優先使用它的配置,而不是 application.properties 中的 logging.* 配置。

    <?xml version="1.0" encoding="UTF-8"?>
    <configuration><include resource="org/springframework/boot/logging/logback/defaults.xml"/><!-- 控制臺輸出的 Appender (使用 JSON 格式) --><appender name="CONSOLE_JSON" class="ch.qos.logback.core.ConsoleAppender"><encoder class="net.logstash.logback.encoder.LogstashEncoder"/></appender><!-- 文件輸出的 Appender (同樣使用 JSON 格式) --><appender name="FILE_JSON" class="ch.qos.logback.core.rolling.RollingFileAppender"><file>logs/app.json.log</file><rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"><fileNamePattern>logs/app.json.%d{yyyy-MM-dd}.log</fileNamePattern><maxHistory>7</maxHistory></rollingPolicy><encoder class="net.logstash.logback.encoder.LogstashEncoder"/></appender><root level="INFO"><!-- 在這里選擇你想要的 Appender --><appender-ref ref="CONSOLE_JSON"/><appender-ref ref="FILE_JSON"/></root><!-- 為特定包設置級別 --><logger name="com.example.myfirstapp" level="DEBUG"/>
    </configuration>
    
  • 運行并觀察日志:
    重啟應用,現在你控制臺輸出的每一行日志都會是一個完整的 JSON 對象!

    {"@timestamp":"2023-11-20T10:30:00.123+08:00", "message":"現在時間是 (cron): 10:30:00", ...}
    

系列最終總結與展望

歷經十個章節的探索與實踐,我們從一個空白的目錄開始,共同構建了一個真正意義上的、具備生產就緒特性的 Spring Boot 應用。讓我們再次回顧這段不凡的旅程:

  1. 奠基篇: 我們學會了如何從零創建一個 Spring Boot 應用。
  2. 數據篇: 我們掌握了與數據庫交互的核心技能。
  3. Web進階篇: 我們讓 API 變得優雅、健壯、規范
  4. 安全篇: 我們為應用穿上了 Spring Security + JWT 的金剛不壞之身。
  5. 配置篇: 我們學會了用 Profiles@ConfigurationProperties 專業地管理配置。
  6. 性能篇I (緩存): 我們用 Redis 為應用裝上了加速器。
  7. 性能篇II (異步/定時): 我們用 @Async@Scheduled 釋放了主線程,實現了自動化。
  8. 微服務基石篇: 我們通過 OpenFeign 掌握了服務間對話的藝術。
  9. 部署篇: 我們用 Docker 將應用打包成了標準化的集裝箱。
  10. 生產就緒篇: 我們用 Actuator結構化日志為應用賦予了可觀測性。

你不再僅僅是一個會寫業務代碼的 CURD Boy/Girl,你已經成長為一名具備全鏈路思維的現代后端工程師。你懂得如何設計、構建、保護、優化、部署和監控一個完整的應用。

未來的路在何方?
這十篇文章為你打下了堅實的地基。以此為起點,你可以向更廣闊的領域探索:

  • 微服務架構: 深入 Spring Cloud/Alibaba,學習服務發現 (Nacos/Eureka)、網關 (Gateway)、分布式事務 (Seata)、熔斷降級 (Resilience4J/Sentinel)。
  • 云原生: 學習 Kubernetes (K8s),了解如何在云上大規模地部署和管理你的容器化應用。
  • 消息隊列: 學習 RabbitMQ/Kafka,實現系統間的異步解耦和削峰填谷。
  • 數據庫深入: 學習分庫分表 (ShardingSphere)、讀寫分離、SQL 優化。
  • 源碼剖析: 深入 Spring/Spring Boot 源碼,理解其自動配置和運行原理。

旅程有終點,但學習無止境。愿你在技術的道路上,永遠保持好奇,不斷攀登。

感謝你的一路相伴,希望這個系列能成為你技術成長道路上一塊堅實的墊腳石。祝編碼愉快!

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

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

相關文章

操作系統知識(1)

操作系統的分類總結 1、批處理操作系統:單道批處理和多道批處理(主機與外設可并行) 2、分時操作系統:一個計算機系統與多個終端設備連接。將CPU的工作時間劃分為許多很短的時間片&#xff0c;輪流為各個終端的用戶服務。 3、實時操作系統:實時是指計算機對于外來信息能夠以足…

一.Sharding分庫分表-基因法+自定義多key分片實現多字段查詢

前言 當下遇到這樣一個場景&#xff0c;由于訂單數據量達到千萬級別&#xff0c;采用分庫分表進行優化&#xff0c;根據訂單的熱查條件&#xff1a;order_no訂單編號進行分表&#xff0c;但是這樣帶來一個問題&#xff0c;用戶查詢自己的訂單怎么查&#xff1f;由于分片鍵使用…

【leetcode】543. 二叉樹的直徑

二叉樹的直徑 題目題解解釋 題目 543. 二叉樹的直徑 給你一棵二叉樹的根節點&#xff0c;返回該樹的 直徑 。 二叉樹的 直徑 是指樹中任意兩個節點之間最長路徑的 長度 。這條路徑可能經過也可能不經過根節點 root 。 兩節點之間路徑的 長度 由它們之間邊數表示。 題解 …

AI基礎知識(07):基于 PyTorch 的手寫體識別案例手冊

目錄 實驗介紹 實驗對象 實驗時間 實驗流程 實驗介紹 隨著人工智能技術的飛速發展&#xff0c;圖像識別技術在眾多領域得到了廣泛應用。手寫體識別作為圖像 識別的一個重要分支&#xff0c;其在教育、金融、醫療等領域具有廣泛的應用前景。本實驗旨在利用深度 學習框架 PyTorc…

wordpress后臺更新后 前端沒變化的解決方法

使用siteground主機的wordpress網站&#xff0c;會出現更新了網站內容和修改了php模板文件、js文件、css文件、圖片文件后&#xff0c;網站沒有變化的情況。 不熟悉siteground主機的新手&#xff0c;遇到這個問題&#xff0c;就很抓狂&#xff0c;明明是哪都沒操作錯誤&#x…

信號(瞬時)頻率求解與仿真實踐(2)

引言 本文是信號(瞬時)頻率求解與仿真實踐專題的第二篇文章&#xff0c;在上一篇博文 [1]信號(瞬時)頻率求解與仿真實踐(1)-CSDN博客中&#xff0c;我構建了信號瞬時頻率求解的基本框架&#xff0c;并且比較詳細地討論了瞬時頻率法。這篇博文探討適用于信號瞬時頻率求解的另一種…

Linux運行發布jar文件攜帶哪些參數

在 CentOS 8 上運行發布的 JAR 文件時,可以根據不同需求攜帶以下參數: 1. 基本運行方式 bash 復制 下載 java -jar your-application.jar 2. 常用 JVM 參數 參數說明-Xms256m初始堆內存大小(如 256MB)-Xmx1024m最大堆內存大小(如 1GB)-XX:MaxMetaspaceSize=256m元空間…

在GIS 工作流中實現數據處理(4)

結果輸出與可視化 最后&#xff0c;我們將統計結果輸出為一個 Excel 文件&#xff0c;并在 ArcMap 中對城市中心區域的土地利用情況進行可視化展示。 import pandas as pd# 將統計表格轉換為 pandas DataFrame df pd.read_csv(statistics_table, sep"\t")# 輸出為…

【術語解釋】網絡安全((SAST, DAST, SCA, IAST),Hadoop, Spark, Hive 的關系

## OWASP Top 10等 OWASP Top 10&#xff1a;OWASP (Open Worldwide Application Security Project&#xff0c;開放全球應用程序安全項目) Top 10 是一份由全球安全專家定期更新的報告&#xff0c;列出了當前 Web 應用程序面臨的十大最關鍵安全風險。 它是一個廣受認可的意識文…

NY197NY205美光閃存固態NY218NY226

NY197NY205美光閃存固態NY218NY226 美光科技作為全球領先的半導體存儲解決方案供應商&#xff0c;其閃存固態硬盤&#xff08;SSD&#xff09;產品線一直備受業界關注。NY197、NY205、NY218和NY226是美光近期推出的幾款重要固態硬盤型號&#xff0c;它們在性能、容量和適用場景…

MinHook 對.NET底層的 SendMessage 攔截真實案例反思

一&#xff1a;背景 1. 講故事 上一篇我們說到了 minhook 的一個簡單使用&#xff0c;這一篇給大家分享一個 minhook 在 dump 分析中的實戰&#xff0c;先看下面的線程棧。 0:044> ~~[138c]s win32u!NtUserMessageCall0x14: 00007ffc5c891184 c3 ret 0:061&g…

qt配合海康工業相機取圖開發

1.最近開發海康工業相機&#xff0c;做取圖demo 2.在MVS運行目錄下找到Development文件夾&#xff0c;找到下圖兩個文件夾一個是頭文件一個是庫文件 3.引用到qt項目中 4.下面是頭文件跟源文件 頭文件 #ifndef MVSCAMERA_H #define MVSCAMERA_H#include <QObject> #incl…

JavaScript基礎學習與應用(后端了解部分)

JavaScript JavaScript原名liveScrip,由美國網景公司開發的一種用于對網頁操作的腳本語言 腳本語言:(不需要編譯 sql html css)由某種解釋器直接解釋運行的 JavaScript是一種解釋性的腳本語言 JavaScript是網頁的行為,可以為網頁提供各種行為(圖片操作) JavaScript一般一對…

Linux環境下安裝和使用RAPIDS平臺的cudf和cuml - pip 安裝方法

? cuDF 和 cuML 是 RAPIDS平臺 的兩個核心組件&#xff0c;它們共同構成了RAPIDS平臺的主要功能 1.linux環境下pip安裝 pip install cuml-cu1224.6.0 --extra-index-urlhttps://pypi.nvidia.com 安裝過程中可能會提示缺少包之類的&#xff0c;按提示進行包的缺失安裝 2.安裝…

基于 Redis 的冪等性設計:SpringBoot @Async 在高并發 MySQL 日志存儲中的應用

一、問題描述 在高并發場景下,大量設備實時上報狀態數據,需要異步保存到MySQL,同時需要解決冪等性校驗和線程池耗盡問題。 二、解決方案 1. 冪等性控制 作用:確保同一請求無論執行多少次,結果都一致,避免重復處理。 實現方式: 唯一標識:設備ID + 時間戳組合Redis原…

ELK日志采集系統

ELK 日志采集系統指的是由 Elasticsearch、Logstash 和 Kibana 三個核心開源軟件組成的套件&#xff0c;用于集中式日志的采集、處理、存儲、搜索、分析和可視化。它現在更常被稱為 Elastic Stack&#xff0c;因為其組件生態已經擴展&#xff08;尤其是引入了 Beats&#xff09…

什么是音頻?

引言&#xff1a;聲音的本質 什么是音頻&#xff1f;振動與感知 音頻&#xff0c;在其最核心的層面&#xff0c;即是我們通常所說的聲音。它起源于物體的振動。這些振動擾動了其周圍的介質&#xff08;例如空氣或水&#xff09;&#xff0c;在介質中產生了微小的壓力變化&…

接口 RESTful 中的超媒體:REST 架構的靈魂驅動

在 RESTful 架構中&#xff0c;** 超媒體&#xff08;Hypermedia&#xff09;** 是一個核心概念&#xff0c;它體現了 REST 的 “表述性狀態轉移&#xff08;Representational State Transfer&#xff09;” 的本質&#xff0c;也是區分 “真 RESTful API” 與 “偽 RESTful AP…

centos clamav 掃描及告警配置

centos clamav 掃描及告警配置 1 下載1.1官網下載1.2 在線下載2 配置3 掃描3.1 更新病毒庫3.2 掃描4 告警4.1 安裝 Postfix4.2 安裝mail郵件工具4.3 配置4.4 發送告警郵箱信息5 定時配置(cronie)5.1 定時更新病毒庫5.2 定時掃描1 下載 1.1官網下載 官網下載地址,下載rpm包…

華為WLAN概述知識點及案例試題

目錄 &#x1f4d8; 華為WLAN概述知識點及案例總結? 一、WLAN技術背景&#x1f4cc; 為什么需要WLAN&#xff1f;&#x1f4cc; 應用趨勢&#xff1a; ? 二、WLAN基本概念&#x1f4cc; WLAN定義&#x1f4cb; IEEE 802.11與Wi-Fi標準演進&#x1f4cb; 發展趨勢&#xff08;…