# 监控与日志 **本文引用的文件** - [server/src/services/sentry.service.ts](file://server/src/services/sentry.service.ts) - [server/dist/services/sentry.service.js](file://server/dist/services/sentry.service.js) - [server/src/services/logger.service.ts](file://server/src/services/logger.service.ts) - [server/dist/services/logger.service.js](file://server/dist/services/logger.service.js) - [server/src/middleware/errorHandler.ts](file://server/src/middleware/errorHandler.ts) - [server/src/app.ts](file://server/src/app.ts) - [server/monitor-book.js](file://server/monitor-book.js) - [server/monitor-generation.js](file://server/monitor-generation.js) - [server/monitor-progress.js](file://server/monitor-progress.js) - [feature_list_monitor.json](file://feature_list_monitor.json) ## 目录 1. [简介](#简介) 2. [项目结构](#项目结构) 3. [核心组件](#核心组件) 4. [架构总览](#架构总览) 5. [详细组件分析](#详细组件分析) 6. [依赖关系分析](#依赖关系分析) 7. [性能考虑](#性能考虑) 8. [故障排查指南](#故障排查指南) 9. [结论](#结论) 10. [附录](#附录) ## 简介 本文件面向AI有声书生成平台,系统性说明监控与日志体系的设计与实践,覆盖以下方面: - Sentry错误监控:初始化、异常捕获、异常分类、Koa中间件集成、采样率与过滤策略 - Winston日志系统:日志级别、格式化输出、文件轮转策略、HTTP请求日志中间件 - 性能监控指标:API响应时间、数据库查询性能、内存使用情况的采集与分析 - 实时监控仪表板:关键指标可视化、趋势分析、异常检测的落地路径 - 日志分析与故障排查:日志聚合、搜索过滤、关联分析的方法论与实操步骤 ## 项目结构 后端采用Koa框架,监控与日志能力通过独立服务模块与中间件注入到应用生命周期中;数据库监控脚本用于观测生成流程状态。 ```mermaid graph TB subgraph "应用层" APP["应用入口
server/src/app.ts"] ROUTER["路由注册
app.ts"] end subgraph "监控与日志服务" SENTRY["Sentry服务
server/src/services/sentry.service.ts"] WINSTON["Winston日志服务
server/src/services/logger.service.ts"] end subgraph "中间件" ERR["错误处理中间件
server/src/middleware/errorHandler.ts"] PERF["性能监控中间件
app.ts 引入"] end subgraph "数据库监控脚本" MON1["监控书籍进度
server/monitor-book.js"] MON2["监控生成流程
server/monitor-generation.js"] MON3["监控进度概览
server/monitor-progress.js"] end APP --> ROUTER APP --> SENTRY APP --> WINSTON APP --> ERR APP --> PERF ROUTER --> MON1 ROUTER --> MON2 ROUTER --> MON3 ``` **图表来源** - [server/src/app.ts:133-194](file://server/src/app.ts#L133-L194) - [server/src/services/sentry.service.ts:1-113](file://server/src/services/sentry.service.ts#L1-L113) - [server/src/services/logger.service.ts:1-114](file://server/src/services/logger.service.ts#L1-L114) - [server/src/middleware/errorHandler.ts:1-67](file://server/src/middleware/errorHandler.ts#L1-L67) - [server/monitor-book.js:1-56](file://server/monitor-book.js#L1-L56) - [server/monitor-generation.js:1-60](file://server/monitor-generation.js#L1-L60) - [server/monitor-progress.js:1-39](file://server/monitor-progress.js#L1-L39) **章节来源** - [server/src/app.ts:133-194](file://server/src/app.ts#L133-L194) ## 核心组件 - Sentry错误监控服务:负责初始化、异常捕获、消息上报、用户与标签上下文设置、Koa错误中间件集成 - Winston日志服务:负责控制台与多文件输出、格式化、轮转策略、HTTP请求日志中间件 - 错误处理中间件:统一错误响应、开发环境堆栈回传、自定义业务错误类型 - 数据库监控脚本:周期性查询书籍状态与章节统计,辅助生成流程可观测性 **章节来源** - [server/src/services/sentry.service.ts:1-113](file://server/src/services/sentry.service.ts#L1-L113) - [server/dist/services/sentry.service.js:1-142](file://server/dist/services/sentry.service.js#L1-L142) - [server/src/services/logger.service.ts:1-114](file://server/src/services/logger.service.ts#L1-L114) - [server/dist/services/logger.service.js:1-95](file://server/dist/services/logger.service.js#L1-L95) - [server/src/middleware/errorHandler.ts:1-67](file://server/src/middleware/errorHandler.ts#L1-L67) ## 架构总览 下图展示Sentry与Winston在应用中的集成位置与调用链路。 ```mermaid sequenceDiagram participant Client as "客户端" participant Koa as "Koa应用
server/src/app.ts" participant SentryMW as "Sentry错误中间件" participant Handler as "业务处理器" participant Winston as "Winston日志中间件" participant SentrySvc as "Sentry服务" Client->>Koa : "HTTP请求" Koa->>SentryMW : "进入Sentry错误中间件" Koa->>Winston : "进入Winston日志中间件" Winston->>Winston : "记录请求开始时间" Koa->>Handler : "执行业务逻辑" alt 发生异常 Handler-->>SentryMW : "抛出异常" SentryMW->>SentrySvc : "captureException(含method/url/user)" SentryMW-->>Koa : "继续抛出异常" else 正常返回 Handler-->>Winston : "正常返回" Winston->>Winston : "计算耗时并记录HTTP日志" end Koa-->>Client : "响应" ``` **图表来源** - [server/src/app.ts:64-75](file://server/src/app.ts#L64-L75) - [server/src/app.ts:92-97](file://server/src/app.ts#L92-L97) - [server/src/services/sentry.service.ts:92-110](file://server/src/services/sentry.service.ts#L92-L110) - [server/src/services/logger.service.ts:75-102](file://server/src/services/logger.service.ts#L75-L102) ## 详细组件分析 ### Sentry错误监控 - 初始化与采样 - 从环境变量读取DSN,未配置则跳过初始化并在控制台提示 - 生产环境采样率为10%,开发环境为100% - 启用Node Profiling集成,便于CPU火焰图分析 - 异常捕获与分类 - 提供捕获异常与消息的便捷函数,并支持设置上下文与严重级别 - 在Koa中间件中自动附加method、url、用户ID等标签,便于分类与检索 - 错误过滤 - 内置过滤器可忽略特定无意义的网络连接拒绝错误,降低噪声 ```mermaid flowchart TD Start(["初始化Sentry"]) --> CheckDSN{"是否配置DSN?"} CheckDSN --> |否| Skip["跳过初始化并记录提示"] CheckDSN --> |是| Init["初始化Sentry
设置采样率/集成/过滤器"] Init --> Ready["Sentry就绪"] Ready --> OnError["捕获异常"] OnError --> Scope["设置上下文/标签/用户"] Scope --> Capture["上报Sentry"] ``` **图表来源** - [server/src/services/sentry.service.ts:7-43](file://server/src/services/sentry.service.ts#L7-L43) - [server/src/services/sentry.service.ts:48-55](file://server/src/services/sentry.service.ts#L48-L55) - [server/src/services/sentry.service.ts:92-110](file://server/src/services/sentry.service.ts#L92-L110) **章节来源** - [server/src/services/sentry.service.ts:1-113](file://server/src/services/sentry.service.ts#L1-L113) - [server/dist/services/sentry.service.js:1-142](file://server/dist/services/sentry.service.js#L1-L142) ### Winston日志系统 - 日志级别与输出 - 控制台输出级别随NODE_ENV动态调整(生产为info,开发为debug) - LOG_LEVEL环境变量可覆盖默认级别 - 文件输出与轮转 - error.log:仅error级别,最大10MB,最多保留10个文件 - combined.log:通用日志,最大10MB,最多保留10个文件 - http.log:HTTP请求日志,最大10MB,最多保留5个文件 - 格式化 - 统一时间戳格式、包含stack字段、支持结构化元数据打印 - HTTP请求日志中间件 - 记录method、url、status、duration、ip、userAgent等字段 - 异常时记录错误信息与堆栈 ```mermaid flowchart TD ReqStart["请求开始"] --> Calc["计算耗时"] Calc --> Normal{"正常返回?"} Normal --> |是| LogHTTP["写入HTTP日志文件"] Normal --> |否| LogErr["写入错误日志文件
包含错误与堆栈"] LogHTTP --> Done["结束"] LogErr --> Done ``` **图表来源** - [server/src/services/logger.service.ts:75-102](file://server/src/services/logger.service.ts#L75-L102) - [server/src/services/logger.service.ts:29-64](file://server/src/services/logger.service.ts#L29-L64) **章节来源** - [server/src/services/logger.service.ts:1-114](file://server/src/services/logger.service.ts#L1-L114) - [server/dist/services/logger.service.js:1-95](file://server/dist/services/logger.service.js#L1-L95) ### 错误处理中间件与自定义错误 - 统一错误响应:设置状态码与标准响应体 - 开发环境:额外返回堆栈信息 - 自定义错误类型:AppError、UnauthorizedError、ForbiddenError、NotFoundError、BadRequestError、QuotaExceededError ```mermaid flowchart TD Try["执行业务逻辑"] --> Catch{"是否抛错?"} Catch --> |否| Next["继续下一个中间件/处理器"] Catch --> |是| BuildResp["构造错误响应体
设置状态码/消息"] BuildResp --> DevEnv{"是否开发环境?"} DevEnv --> |是| AddStack["附加堆栈信息"] DevEnv --> |否| SkipStack["不附加堆栈"] AddStack --> Return["返回响应"] SkipStack --> Return ``` **图表来源** - [server/src/middleware/errorHandler.ts:3-24](file://server/src/middleware/errorHandler.ts#L3-L24) **章节来源** - [server/src/middleware/errorHandler.ts:1-67](file://server/src/middleware/errorHandler.ts#L1-L67) ### 数据库监控脚本 - monitor-book.js:按3秒间隔轮询指定书籍的章节层级统计,直到完成或失败 - monitor-generation.js:按30秒间隔轮询书籍状态、章节数量与已完成内容数 - monitor-progress.js:按5秒间隔轮询书籍状态与进度 ```mermaid flowchart TD Start(["开始监控"]) --> Loop["循环N次"] Loop --> Query["查询书籍状态与章节统计"] Query --> Print["打印状态/进度/章节统计"] Print --> Check{"状态=completed/failed?"} Check --> |是| End["结束并输出最终统计"] Check --> |否| Sleep["等待固定间隔"] Sleep --> Loop ``` **图表来源** - [server/monitor-book.js:4-50](file://server/monitor-book.js#L4-L50) - [server/monitor-generation.js:4-54](file://server/monitor-generation.js#L4-L54) - [server/monitor-progress.js:4-33](file://server/monitor-progress.js#L4-L33) **章节来源** - [server/monitor-book.js:1-56](file://server/monitor-book.js#L1-L56) - [server/monitor-generation.js:1-60](file://server/monitor-generation.js#L1-L60) - [server/monitor-progress.js:1-39](file://server/monitor-progress.js#L1-L39) ## 依赖关系分析 - 应用入口在启动阶段初始化Sentry,随后连接数据库、测试Redis与存储、初始化WebSocket、启动路由与队列处理器 - 中间件顺序对可观测性至关重要:错误处理中间件应尽早拦截;Sentry中间件负责异常上报;Winston中间件负责日志记录;性能中间件负责指标采集 ```mermaid graph LR Start["应用启动"] --> InitSentry["initSentry()"] InitSentry --> ConnectDB["连接数据库"] ConnectDB --> TestRedis["测试Redis连接"] TestRedis --> TestStorage["测试存储连接"] TestStorage --> InitWS["初始化WebSocket"] InitWS --> Routes["注册路由"] Routes --> Middlewares["中间件链路"] Middlewares --> SentryMW["Sentry错误中间件"] Middlewares --> WinstonMW["Winston日志中间件"] Middlewares --> PerfMW["性能监控中间件"] ``` **图表来源** - [server/src/app.ts:133-194](file://server/src/app.ts#L133-L194) **章节来源** - [server/src/app.ts:133-194](file://server/src/app.ts#L133-L194) ## 性能考虑 - API响应时间 - 使用Winston中间件记录每次请求的耗时,结合前端埋点与Sentry事务采样,形成端到端时延画像 - 数据库查询性能 - 结合Prisma日志与数据库慢查询日志,定位长事务与热点查询 - 监控脚本可作为轻量级数据库侧观测手段,辅助生成流程稳定性评估 - 内存使用情况 - 结合Node.js进程指标与容器监控,观察峰值与GC行为 - 对批量任务(如音频合成)进行分片与限流,避免内存抖动 - 采样与成本平衡 - Sentry在生产环境采用10%的事务采样,避免高基数追踪带来的成本压力 **章节来源** - [server/src/services/logger.service.ts:75-102](file://server/src/services/logger.service.ts#L75-L102) - [server/src/services/sentry.service.ts:15-22](file://server/src/services/sentry.service.ts#L15-L22) - [server/monitor-generation.js:4-54](file://server/monitor-generation.js#L4-L54) ## 故障排查指南 - 日志聚合与搜索 - 使用HTTP日志文件定位请求路径与状态码,结合错误日志快速定位异常堆栈 - 利用结构化元数据字段进行过滤(如method、url、status、duration) - 关联分析 - 将Sentry事件与对应HTTP请求ID关联,结合Winston日志中的时间戳与IP,还原用户行为链路 - 自动化修复与回归 - 参考功能清单中的“错误自动分析与修复”流程,设计自动化修复接口与状态回写机制 - 常见问题定位 - Redis连接失败:检查过滤器是否忽略该错误,确认实际连接状态 - 大文件上传超时:检查bodyparser与koa-body配置及磁盘空间 - 生成流程卡住:使用监控脚本观察章节状态变化,定位阻塞节点 **章节来源** - [server/src/services/logger.service.ts:75-102](file://server/src/services/logger.service.ts#L75-L102) - [server/src/services/sentry.service.ts:24-38](file://server/src/services/sentry.service.ts#L24-L38) - [feature_list_monitor.json:10-44](file://feature_list_monitor.json#L10-L44) ## 结论 本监控与日志体系以Sentry与Winston为核心,配合统一错误处理中间件与性能监控中间件,实现了从异常捕获、日志记录到指标采集的全链路可观测性。数据库监控脚本进一步增强了生成流程的可见性。建议后续完善: - 实时仪表板:基于HTTP日志与Sentry事件构建可视化面板 - 告警规则:针对错误率、P95/P99延迟、数据库慢查询、Redis可用性等建立阈值告警 - 安全与合规:对敏感信息脱敏、限制日志保留周期、审计访问权限 ## 附录 - 环境变量与配置要点 - SENTRY_DSN:Sentry DSN,未配置时跳过初始化 - NODE_ENV:影响Sentry采样率与控制台日志级别 - LOG_LEVEL:覆盖默认日志级别 - 测试与验证 - 参考功能清单中的后端与前端测试步骤,验证日志中间件、错误日志查询与自动修复接口 **章节来源** - [server/src/services/sentry.service.ts:8-13](file://server/src/services/sentry.service.ts#L8-L13) - [server/src/services/logger.service.ts:69-72](file://server/src/services/logger.service.ts#L69-L72) - [feature_list_monitor.json:14-25](file://feature_list_monitor.json#L14-L25) - [feature_list_monitor.json:30-43](file://feature_list_monitor.json#L30-L43)