# 日志监控服务
**本文引用的文件**
- [server/src/app.ts](file://server/src/app.ts)
- [server/src/services/logger.service.ts](file://server/src/services/logger.service.ts)
- [server/src/services/sentry.service.ts](file://server/src/services/sentry.service.ts)
- [server/src/middleware/errorHandler.ts](file://server/src/middleware/errorHandler.ts)
- [server/src/services/requestLogger.ts](file://server/src/services/requestLogger.ts)
- [server/src/services/log.service.ts](file://server/src/services/log.service.ts)
- [server/src/services/log.controller.ts](file://server/src/services/log.controller.ts)
## 目录
1. [简介](#简介)
2. [项目结构](#项目结构)
3. [核心组件](#核心组件)
4. [架构总览](#架构总览)
5. [详细组件分析](#详细组件分析)
6. [依赖关系分析](#依赖关系分析)
7. [性能考量](#性能考量)
8. [故障排查指南](#故障排查指南)
9. [结论](#结论)
10. [附录](#附录)
## 简介
本文件面向AI有声书生成平台的日志监控服务,系统性阐述错误监控(Sentry)、请求日志中间件、日志格式与轮转策略、性能监控与指标采集、以及日志在系统调试、性能分析与安全审计中的关键作用。文档基于仓库中现有的日志与监控实现进行深入分析,并提供可操作的集成与扩展建议。
## 项目结构
日志监控相关能力主要分布在以下模块:
- 应用入口:注册中间件与路由,统一启动流程
- 日志服务:基于Winston的多通道日志输出、HTTP请求日志中间件
- 错误监控:基于Sentry的错误捕获、性能采样与错误过滤
- 请求日志:独立的请求日志中间件与持久化服务
- 日志控制器:提供日志查询、错误分析、统计与清理等API
```mermaid
graph TB
subgraph "应用层"
APP["应用入口
server/src/app.ts"]
end
subgraph "日志与监控"
WLOG["Winston日志服务
server/src/services/logger.service.ts"]
SENTRY["Sentry错误监控
server/src/services/sentry.service.ts"]
REQLOG["请求日志中间件
server/src/services/requestLogger.ts"]
LOGSVC["日志服务(内存+文件)
server/src/services/log.service.ts"]
LOGCTRL["日志控制器
server/src/services/log.controller.ts"]
ERRMW["错误处理中间件
server/src/middleware/errorHandler.ts"]
end
APP --> WLOG
APP --> SENTRY
APP --> REQLOG
APP --> LOGCTRL
REQLOG --> LOGSVC
APP --> ERRMW
```
图表来源
- [server/src/app.ts:63-130](file://server/src/app.ts#L63-L130)
- [server/src/services/logger.service.ts:67-114](file://server/src/services/logger.service.ts#L67-L114)
- [server/src/services/sentry.service.ts:7-43](file://server/src/services/sentry.service.ts#L7-L43)
- [server/src/services/requestLogger.ts:4-57](file://server/src/services/requestLogger.ts#L4-L57)
- [server/src/services/log.service.ts:42-354](file://server/src/services/log.service.ts#L42-L354)
- [server/src/services/log.controller.ts:1-233](file://server/src/services/log.controller.ts#L1-L233)
- [server/src/middleware/errorHandler.ts:3-24](file://server/src/middleware/errorHandler.ts#L3-L24)
章节来源
- [server/src/app.ts:63-130](file://server/src/app.ts#L63-L130)
## 核心组件
- Winston日志服务:控制台彩色输出、错误/常规/HTTP三类文件日志、按大小与文件数轮转
- Sentry错误监控:DSN初始化、性能采样、错误过滤、上下文与标签设置、Koa错误中间件
- 请求日志中间件:记录请求/响应元数据、状态码分级、异步持久化至内存与文件
- 日志控制器:提供日志查询、错误分析、统计、清理与自动修复建议接口
- 错误处理中间件:统一错误响应、开发环境返回堆栈、基础业务错误类型
章节来源
- [server/src/services/logger.service.ts:11-114](file://server/src/services/logger.service.ts#L11-L114)
- [server/src/services/sentry.service.ts:7-113](file://server/src/services/sentry.service.ts#L7-L113)
- [server/src/services/requestLogger.ts:4-57](file://server/src/services/requestLogger.ts#L4-L57)
- [server/src/services/log.service.ts:4-354](file://server/src/services/log.service.ts#L4-L354)
- [server/src/services/log.controller.ts:1-233](file://server/src/services/log.controller.ts#L1-L233)
- [server/src/middleware/errorHandler.ts:3-67](file://server/src/middleware/errorHandler.ts#L3-L67)
## 架构总览
整体监控链路由“请求进入 -> 错误/性能中间件 -> 请求日志 -> 日志服务 -> 多通道输出”构成;同时通过Sentry对异常进行集中上报与性能采样。
```mermaid
sequenceDiagram
participant C as "客户端"
participant A as "应用入口(app.ts)"
participant MW1 as "错误处理中间件"
participant MW2 as "Sentry错误中间件"
participant MW3 as "性能监控中间件"
participant MW4 as "Winston日志中间件"
participant R as "请求日志中间件"
participant L as "日志服务"
participant S as "Sentry"
C->>A : 发起HTTP请求
A->>MW1 : 进入错误处理
A->>MW2 : 进入Sentry错误中间件
A->>MW3 : 进入性能监控
A->>MW4 : 进入Winston日志
A->>R : 进入请求日志中间件
R->>L : 写入请求日志(内存+文件)
MW4-->>C : 返回响应
MW2-->>S : 上报异常(如发生)
MW3-->>A : 采集性能指标
```
图表来源
- [server/src/app.ts:63-130](file://server/src/app.ts#L63-L130)
- [server/src/middleware/errorHandler.ts:3-24](file://server/src/middleware/errorHandler.ts#L3-L24)
- [server/src/services/sentry.service.ts:92-110](file://server/src/services/sentry.service.ts#L92-L110)
- [server/src/services/logger.service.ts:74-102](file://server/src/services/logger.service.ts#L74-L102)
- [server/src/services/requestLogger.ts:4-57](file://server/src/services/requestLogger.ts#L4-L57)
- [server/src/services/log.service.ts:140-171](file://server/src/services/log.service.ts#L140-L171)
## 详细组件分析
### Winston日志服务与HTTP请求日志中间件
- 多通道输出
- 控制台:开发环境输出彩色日志,生产环境提升至info级别
- 错误日志文件:仅记录error级别,包含堆栈
- 常规日志文件:记录info及以上级别,包含堆栈
- HTTP请求日志文件:记录http级别,包含方法、URL、状态、耗时、IP、UA
- 日志格式:统一时间戳、级别、消息或堆栈、附加元数据JSON化
- HTTP中间件:在next()后计算耗时并写入HTTP日志;异常时写入错误日志并抛出
- 环境变量控制:LOG_LEVEL决定全局级别,NODE_ENV影响控制台级别
```mermaid
flowchart TD
Start(["进入httpLogger"]) --> CallNext["执行下游中间件(next)"]
CallNext --> IsErr{"是否抛出异常?"}
IsErr -- 否 --> Calc["计算耗时(ms)"]
Calc --> WriteHttp["写入HTTP日志文件"]
WriteHttp --> End(["结束"])
IsErr -- 是 --> CalcErr["计算耗时(ms)"]
CalcErr --> WriteErr["写入错误日志(含堆栈)"]
WriteErr --> Throw["重新抛出异常"]
Throw --> End
```
图表来源
- [server/src/services/logger.service.ts:74-102](file://server/src/services/logger.service.ts#L74-L102)
章节来源
- [server/src/services/logger.service.ts:11-114](file://server/src/services/logger.service.ts#L11-L114)
### Sentry错误监控集成
- 初始化:读取SENTRY_DSN,未配置则跳过;设置环境、采样率、性能分析集成、错误过滤
- 错误过滤:忽略特定无关错误(如Redis连接被拒绝)
- 上下文与标签:支持设置用户、标签、严重级别、自定义上下文
- Koa错误中间件:捕获异常并携带method/url/user上下文上报
```mermaid
sequenceDiagram
participant M as "Sentry错误中间件"
participant C as "Koa上下文"
participant S as "Sentry SDK"
M->>C : 获取method/url/user
M->>S : withScope设置标签/用户
M->>S : captureException(异常)
M-->>C : 抛出异常(交由后续中间件处理)
```
图表来源
- [server/src/services/sentry.service.ts:92-110](file://server/src/services/sentry.service.ts#L92-L110)
- [server/src/services/sentry.service.ts:7-43](file://server/src/services/sentry.service.ts#L7-L43)
章节来源
- [server/src/services/sentry.service.ts:7-113](file://server/src/services/sentry.service.ts#L7-L113)
### 请求日志中间件与日志服务
- 请求日志中间件:生成请求ID、记录请求头、IP、UA、状态码、响应时间与大小;根据状态码分级
- 日志服务:内存中维护请求日志,限制最大条数;异步落盘至requests.json;提供查询、错误分析、统计、清理、自动修复建议
- 错误模式识别:内置常见错误类型的正则与修复建议,支持自动分析与建议返回
```mermaid
classDiagram
class LogService {
+logs : RequestLog[]
+logRequest(log)
+getLogs(filter)
+getErrorLogs()
+getRecentErrors(count)
+analyzeErrors()
+autoAnalyzeError(log)
+clearLogs(olderThanHours?)
+getStats()
}
class RequestLog {
+requestId : string
+timestamp : Date
+method : string
+path : string
+query : string
+status : number
+responseTime : number
+responseSize : number
+level : LogLevel
+error? : string
+stack? : string
+headers : map
+ip : string
+userAgent : string
+body? : any
}
LogService --> RequestLog : "管理"
```
图表来源
- [server/src/services/log.service.ts:42-354](file://server/src/services/log.service.ts#L42-L354)
- [server/src/services/requestLogger.ts:4-57](file://server/src/services/requestLogger.ts#L4-L57)
章节来源
- [server/src/services/requestLogger.ts:4-57](file://server/src/services/requestLogger.ts#L4-L57)
- [server/src/services/log.service.ts:42-354](file://server/src/services/log.service.ts#L42-L354)
### 错误处理中间件与自定义错误类型
- 统一错误响应:设置状态码与标准返回结构
- 开发环境:附加堆栈信息
- 自定义错误类:AppError、UnauthorizedError、ForbiddenError、NotFoundError、BadRequestError、QuotaExceededError
```mermaid
flowchart TD
Enter(["进入errorHandler"]) --> TryNext["执行下游(next)"]
TryNext --> Catch{"是否抛出异常?"}
Catch -- 否 --> End(["结束"])
Catch -- 是 --> BuildResp["构造错误响应(含状态/代码/消息)"]
BuildResp --> DevEnv{"开发环境?"}
DevEnv -- 是 --> AddStack["附加堆栈"]
DevEnv -- 否 --> SkipStack["不附加堆栈"]
AddStack --> End
SkipStack --> End
```
图表来源
- [server/src/middleware/errorHandler.ts:3-24](file://server/src/middleware/errorHandler.ts#L3-L24)
章节来源
- [server/src/middleware/errorHandler.ts:3-67](file://server/src/middleware/errorHandler.ts#L3-L67)
### 日志控制器与API
- 查询请求日志:支持按级别、路径、状态、时间范围筛选,分页返回
- 获取错误日志与分析:最近错误、错误聚合分析、自动修复建议
- 统计与清理:总览统计、按小时清理旧日志
- 测试接口:模拟多种错误类型便于联调
章节来源
- [server/src/services/log.controller.ts:1-233](file://server/src/services/log.controller.ts#L1-L233)
## 依赖关系分析
- 应用入口统一注册中间件顺序:错误处理 -> Sentry错误中间件 -> 性能监控 -> Winston日志 -> 安全中间件 -> CORS -> BodyParser -> 静态文件 -> 路由
- 请求日志中间件与日志服务解耦,既可通过Winston输出到文件,也可通过请求日志中间件持久化到内存与文件
- Sentry与Winston并行工作,前者专注异常与性能,后者专注结构化日志与HTTP追踪
```mermaid
graph LR
APP["app.ts"] --> ERR["errorHandler.ts"]
APP --> SERR["sentry.service.ts"]
APP --> PERF["performance.ts"]
APP --> WLOG["logger.service.ts"]
APP --> SEC["security.ts"]
APP --> CORS["cors"]
APP --> BODY["bodyparser"]
APP --> STATIC["static"]
APP --> ROUTER["log.controller.ts"]
ROUTER --> REQLOG["requestLogger.ts"]
REQLOG --> LOGSVC["log.service.ts"]
```
图表来源
- [server/src/app.ts:63-130](file://server/src/app.ts#L63-L130)
- [server/src/services/log.controller.ts:1-233](file://server/src/services/log.controller.ts#L1-L233)
- [server/src/services/requestLogger.ts:4-57](file://server/src/services/requestLogger.ts#L4-L57)
- [server/src/services/log.service.ts:42-354](file://server/src/services/log.service.ts#L42-L354)
- [server/src/services/logger.service.ts:67-114](file://server/src/services/logger.service.ts#L67-L114)
- [server/src/services/sentry.service.ts:7-43](file://server/src/services/sentry.service.ts#L7-L43)
章节来源
- [server/src/app.ts:63-130](file://server/src/app.ts#L63-L130)
## 性能考量
- Winston轮转策略:单文件最大10MB,错误/常规各10个文件,HTTP 5个文件,避免磁盘无限增长
- 请求日志异步落盘:通过延时保存减少IO阻塞
- Sentry采样率:生产环境降低Traces采样,提高性能;开启CPU Profiling采样
- 中间件顺序:将性能监控置于错误捕获之后,确保异常也能被采样
章节来源
- [server/src/services/logger.service.ts:38-64](file://server/src/services/logger.service.ts#L38-L64)
- [server/src/services/log.service.ts:130-138](file://server/src/services/log.service.ts#L130-L138)
- [server/src/services/sentry.service.ts:15-22](file://server/src/services/sentry.service.ts#L15-L22)
## 故障排查指南
- Sentry未生效
- 检查是否配置SENTRY_DSN;若未配置,初始化会跳过
- 查看初始化日志输出
- 错误未上报
- 确认Sentry错误中间件已在应用入口注册
- 检查错误过滤规则是否误判
- 日志缺失
- 确认Winston日志目录存在且有写权限
- 检查LOG_LEVEL与NODE_ENV是否导致日志被抑制
- 请求日志不显示
- 确认请求日志中间件已注册
- 检查日志文件是否被清理或轮转覆盖
- 自动修复建议无效
- 确认错误内容与内置正则匹配
- 可扩展错误模式与修复建议映射
章节来源
- [server/src/services/sentry.service.ts:7-43](file://server/src/services/sentry.service.ts#L7-L43)
- [server/src/services/logger.service.ts:5-9](file://server/src/services/logger.service.ts#L5-L9)
- [server/src/services/requestLogger.ts:4-57](file://server/src/services/requestLogger.ts#L4-L57)
- [server/src/services/log.service.ts:66-110](file://server/src/services/log.service.ts#L66-L110)
## 结论
该日志监控体系以Winston提供结构化日志与HTTP追踪,以Sentry提供异常与性能采样,辅以独立的请求日志中间件与日志服务,形成“请求可观测、异常可追踪、性能可度量”的闭环。通过清晰的日志级别、标准化格式与轮转策略,结合错误分析与自动修复建议,显著提升系统调试效率与稳定性保障。
## 附录
### 环境变量与配置要点
- LOG_LEVEL:Winston全局日志级别
- NODE_ENV:影响控制台输出级别与Sentry采样率
- SENTRY_DSN:Sentry数据源标识,未配置则跳过初始化
章节来源
- [server/src/services/logger.service.ts:68-72](file://server/src/services/logger.service.ts#L68-L72)
- [server/src/services/sentry.service.ts:7-43](file://server/src/services/sentry.service.ts#L7-L43)
### 实际代码示例(路径指引)
- 初始化Sentry:[server/src/services/sentry.service.ts:7-43](file://server/src/services/sentry.service.ts#L7-L43)
- 设置用户上下文与标签:[server/src/services/sentry.service.ts:75-87](file://server/src/services/sentry.service.ts#L75-L87)
- 捕获异常与消息:[server/src/services/sentry.service.ts:48-70](file://server/src/services/sentry.service.ts#L48-L70)
- Koa错误中间件:[server/src/services/sentry.service.ts:92-110](file://server/src/services/sentry.service.ts#L92-L110)
- Winston日志配置与HTTP中间件:[server/src/services/logger.service.ts:11-114](file://server/src/services/logger.service.ts#L11-L114)
- 请求日志中间件:[server/src/services/requestLogger.ts:4-57](file://server/src/services/requestLogger.ts#L4-L57)
- 日志服务与错误分析:[server/src/services/log.service.ts:42-354](file://server/src/services/log.service.ts#L42-L354)
- 日志控制器API:[server/src/services/log.controller.ts:1-233](file://server/src/services/log.controller.ts#L1-L233)
- 应用入口注册顺序:[server/src/app.ts:63-130](file://server/src/app.ts#L63-L130)