跳到主要内容

日志监控系统

目录

  1. 简介
  2. 项目结构
  3. 核心组件
  4. 架构总览
  5. 组件详解
  6. 依赖关系分析
  7. 性能与扩展性
  8. 故障排查指南
  9. 结论
  10. 附录:API 与集成指南

简介

本文件面向“日志监控系统”的设计与实现,围绕访问日志、错误日志、操作日志的采集、存储与分析进行系统化说明。重点覆盖以下方面:

  • 访问日志采集:基于拦截器与过滤器的请求/响应采集、AOP 切面与注解驱动的操作日志、异步落库策略
  • 存储策略:数据库持久化、文件存储(Logback 轮转)、可选日志中间件(如 Kafka/RocketMQ)的接入思路
  • 查询与分析:分页查询、条件筛选、时间范围、关键字搜索、导出能力
  • 监控与告警:Prometheus 告警接收、阈值与异常检测的落地方式
  • 运维最佳实践:日志格式标准化、敏感信息脱敏、日志轮转与归档
  • 完整 API 文档与集成示例:控制器层暴露的查询与导出接口

项目结构

日志监控系统由“框架层”和“业务模块层”共同组成:

  • 框架层提供统一的访问日志拦截与自动装配能力(拦截器、过滤器、AOP)
  • 业务模块层负责具体日志的落库、查询、导出与运维配置(Logback 轮转)

Mermaid Diagram Code:

graph TB
subgraph "框架层"
A["ApiAccessLogInterceptor<br/>请求/响应拦截"]
B["YudaoApiLogAutoConfiguration<br/>自动装配与注册"]
end
subgraph "业务模块层"
C["ApiAccessLogController<br/>查询/导出接口"]
D["ApiAccessLogService/Impl<br/>服务与DAO"]
E["ApiAccessLogDO<br/>数据对象"]
F["Logback 轮转配置<br/>各模块 logback-spring.xml"]
end
subgraph "外部系统"
G["数据库<br/>infra_api_access_log"]
H["Prometheus<br/>告警接收"]
end
A --> B
B --> C
C --> D
D --> E
E --> G
F --> G
H --> C

图表来源

章节来源

核心组件

  • 访问日志拦截器:在非生产环境输出请求/响应日志,并记录耗时与控制器定位信息
  • 自动装配配置:注册过滤器与拦截器,提供开关控制
  • 控制器:提供分页查询与 Excel 导出能力
  • 服务层:封装创建、分页查询、清理过期日志
  • 数据对象:映射数据库表 infra_api_access_log
  • Logback 配置:统一文件存储与轮转策略
  • Prometheus 告警接收:提供告警回调入口

章节来源

架构总览

访问日志从请求进入开始采集,经拦截器/过滤器记录请求与响应,随后异步写入数据库;同时通过 Logback 将日志落盘并按策略轮转;管理员可通过控制器接口进行查询与导出;Prometheus 可推送告警至系统。

Mermaid Diagram Code:

sequenceDiagram
participant Client as "客户端"
participant Gateway as "网关/控制器"
participant Interceptor as "访问日志拦截器"
participant Service as "访问日志服务"
participant DAO as "访问日志DAO"
participant DB as "数据库"
participant LB as "Logback(文件)"
participant Prom as "Prometheus"
Client->>Gateway : 发起HTTP请求
Gateway->>Interceptor : 进入拦截器(preHandle)
Interceptor-->>LB : 输出请求日志(非生产)
Gateway->>Gateway : 执行业务逻辑
Gateway-->>Interceptor : 返回响应(afterCompletion)
Interceptor-->>LB : 输出耗时/定位信息(非生产)
Gateway->>Service : 创建访问日志(异步)
Service->>DAO : 插入记录
DAO->>DB : 写入 infra_api_access_log
LB-->>LB : 文件轮转与归档
Prom-->>Gateway : 推送告警回调(/infra/alerts)

图表来源

组件详解

访问日志采集与拦截

  • 拦截器职责:记录请求参数、请求头、请求体(非生产环境),并在完成后输出耗时与控制器定位
  • 关键点:支持选择性打印请求头、对请求体换行符进行清洗、在开发/测试环境输出更详尽日志

Mermaid Diagram Code:

flowchart TD
Start(["进入 preHandle"]) --> CheckEnv["判断是否非生产环境"]
CheckEnv --> |否| PrintReq["跳过请求日志输出"]
CheckEnv --> |是| Collect["收集请求头/参数/请求体"]
Collect --> LogReq["输出请求日志"]
LogReq --> Timer["启动计时器"]
Timer --> Handler["记录控制器方法位置"]
Handler --> EndPre["返回继续处理"]
After(["afterCompletion"]) --> TimerStop["停止计时器"]
TimerStop --> LogDur["输出耗时与定位信息"]
LogDur --> EndAfter(["结束"])

图表来源

章节来源

自动装配与注册

  • 自动装配:注册访问日志过滤器与拦截器,支持通过配置项禁用
  • 过滤器:负责在请求前后记录访问日志并异步提交入库
  • 拦截器:补充输出请求/响应日志与耗时统计(非生产)

Mermaid Diagram Code:

classDiagram
class YudaoApiLogAutoConfiguration {
+apiAccessLogFilter(...)
+addInterceptors(...)
+advice(...)
}
class ApiAccessLogFilter {
+doFilter(...)
}
class ApiAccessLogInterceptor {
+preHandle(...)
+afterCompletion(...)
}
YudaoApiLogAutoConfiguration --> ApiAccessLogFilter : "注册过滤器"
YudaoApiLogAutoConfiguration --> ApiAccessLogInterceptor : "注册拦截器"

图表来源

章节来源

服务与数据模型

  • 服务接口:提供创建、分页查询、清理过期日志的能力
  • 服务实现:对请求参数与结果消息进行长度裁剪,支持多租户上下文
  • 数据对象:映射数据库表 infra_api_access_log,包含链路追踪、用户信息、请求/响应、执行时长与结果码等字段

Mermaid Diagram Code:

classDiagram
class ApiAccessLogService {
<<interface>>
+createApiAccessLog(dto)
+getApiAccessLogPage(reqVO)
+cleanAccessLog(exceedDay, deleteLimit)
}
class ApiAccessLogServiceImpl {
-apiAccessLogMapper
+createApiAccessLog(dto)
+getApiAccessLogPage(reqVO)
+cleanAccessLog(exceedDay, deleteLimit)
}
class ApiAccessLogDO {
+id
+traceId
+userId
+userType
+applicationName
+requestMethod
+requestUrl
+requestParams
+responseBody
+userIp
+userAgent
+operateModule
+operateName
+operateType
+beginTime
+endTime
+duration
+resultCode
+resultMsg
}
ApiAccessLogService <|.. ApiAccessLogServiceImpl
ApiAccessLogServiceImpl --> ApiAccessLogDO : "插入/查询"

图表来源

章节来源

查询与导出接口

  • 分页查询:支持用户编号、用户类型、应用名、请求地址(模糊)、时间范围、执行时长、结果码等条件
  • 导出 Excel:支持无分页导出并写入 Excel

Mermaid Diagram Code:

sequenceDiagram
participant Admin as "管理员"
participant Ctrl as "ApiAccessLogController"
participant Svc as "ApiAccessLogService"
participant Mapper as "ApiAccessLogMapper"
participant DB as "数据库"
participant Excel as "Excel导出"
Admin->>Ctrl : GET /infra/api-access-log/page
Ctrl->>Svc : getApiAccessLogPage(reqVO)
Svc->>Mapper : selectPage(reqVO)
Mapper->>DB : 查询分页
DB-->>Mapper : 结果集
Mapper-->>Svc : PageResult
Svc-->>Ctrl : PageResult
Ctrl-->>Admin : 返回分页数据
Admin->>Ctrl : GET /infra/api-access-log/export-excel
Ctrl->>Svc : getApiAccessLogPage(无分页)
Svc->>Mapper : selectPage(reqVO)
Mapper->>DB : 查询全部
DB-->>Mapper : 结果集
Mapper-->>Svc : 列表
Svc-->>Ctrl : 列表
Ctrl->>Excel : 写入Excel并返回

图表来源

章节来源

存储策略与日志轮转

  • 数据库存储:通过服务层插入数据库表 infra_api_access_log
  • 文件存储:各模块统一采用 Logback RollingFileAppender,支持按大小与时间滚动、保留天数与总量上限
  • 链路追踪:日志中包含 traceId,便于跨系统关联

Mermaid Diagram Code:

flowchart TD
Req["请求处理"] --> Inspect["拦截器/过滤器采集"]
Inspect --> DBWrite["服务层写入数据库"]
Inspect --> FileWrite["Logback写入文件"]
FileWrite --> Rotate["按策略轮转/压缩/清理"]
DBWrite --> Query["分页查询/导出"]

图表来源

章节来源

监控与告警

  • Prometheus 告警接收:提供 /infra/alerts 接口接收告警消息,便于集成外部监控平台
  • 告警联动:可结合访问日志与错误日志进行异常检测与阈值告警

Mermaid Diagram Code:

sequenceDiagram
participant Prom as "Prometheus"
participant Ctrl as "PrometheusController"
Prom->>Ctrl : POST /infra/alerts
Ctrl-->>Prom : 200 OK

图表来源

章节来源

依赖关系分析

  • 组件耦合:控制器依赖服务接口;服务实现依赖 Mapper 与 DO;拦截器/过滤器依赖通用工具与配置
  • 外部依赖:数据库表 infra_api_access_log、Logback 轮转策略、Prometheus 告警回调

Mermaid Diagram Code:

graph LR
Ctrl["ApiAccessLogController"] --> Svc["ApiAccessLogService"]
Svc --> Impl["ApiAccessLogServiceImpl"]
Impl --> DO["ApiAccessLogDO"]
Impl --> Mapper["ApiAccessLogMapper"]
Inter["ApiAccessLogInterceptor"] --> Conf["YudaoApiLogAutoConfiguration"]
Conf --> Ctrl
LB["Logback配置"] --> DB["数据库"]
Impl --> DB

图表来源

章节来源

性能与扩展性

  • 异步落库:通过服务层异步写入数据库,降低请求路径阻塞
  • 分页与导出:分页查询限制单次数据量,导出接口支持无分页一次性导出
  • 清理策略:按天清理过期日志,循环删除直至达到预期条数
  • 轮转策略:按大小与时间滚动,控制保留天数与总量,避免磁盘膨胀

章节来源

故障排查指南

  • 访问日志未输出
    • 检查是否处于生产环境(非生产环境才输出请求/响应日志)
    • 检查自动装配是否生效与过滤器/拦截器是否注册
  • 日志未落库
    • 检查服务层是否正确调用 Mapper 插入
    • 检查租户上下文是否为空导致忽略插入
  • 日志轮转异常
    • 检查 Logback 配置中的文件名模式、最大文件大小、保留天数与总量上限
  • 告警未到达
    • 检查 /infra/alerts 是否可达且返回 200

章节来源

结论

该日志监控系统以拦截器/过滤器为核心采集点,结合服务层异步落库与 Logback 文件轮转,形成“请求可观测、结果可查、问题可追”的完整闭环。通过分页查询与导出能力支撑日常分析,Prometheus 告警回调为运维监控提供扩展入口。建议在生产环境谨慎开启请求/响应日志输出,合理配置轮转策略与清理周期,确保系统稳定与合规。

附录:API 与集成指南

数据库表结构(日志存储)

  • 表名:infra_api_access_log
  • 关键字段:链路追踪编号、用户信息、应用名、请求/响应、执行时长、结果码与消息、时间戳等
  • 索引:按创建时间建立索引,便于分页与清理

章节来源

访问日志查询接口

  • GET /infra/api-access-log/page
    • 功能:分页查询访问日志
    • 支持条件:用户编号、用户类型、应用名、请求地址(模糊)、时间范围、执行时长≥、结果码
    • 返回:分页结果,包含用户名与昵称映射

章节来源

访问日志导出接口

  • GET /infra/api-access-log/export-excel
    • 功能:导出访问日志为 Excel
    • 返回:Excel 文件流

章节来源

Prometheus 告警接收

  • POST /infra/alerts
    • 功能:接收 Prometheus 告警消息
    • 返回:200 OK

章节来源

运维最佳实践

  • 日志格式标准化:统一字段命名与 JSON 结构,便于检索与分析
  • 日志脱敏:对敏感字段(如密码、手机号)进行脱敏处理
  • 日志轮转:按大小与时间滚动,设置合理的保留天数与总量上限
  • 清理策略:定期清理过期日志,避免数据库与磁盘压力过大
  • 告警阈值:结合访问量、错误率、响应时间等指标设定阈值,联动 Prometheus 与系统告警

[本节为通用指导,无需列出章节来源]

用户文档
AI 助手
Agent 列表
请选择一个 Agent 开始对话
AI 问答