【生产就曲篇】让应用可观测: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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈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;…