日志与监控
规则
- 结构化日志:JSON 格式,包含
timestamp、level、message、requestId、userId 字段
- 日志级别:
error(故障)、warn(降级)、info(业务事件)、debug(仅开发环境)
- 使用 Pino 进行 Node.js 日志记录 — 快速、结构化、默认 JSON 格式
- Sentry 用于错误追踪:尽早初始化、捕获未处理异常、添加用户上下文与面包屑
- 使用请求 ID 关联日志 — 为每个请求生成 UUID,并在所有服务调用中传递
- 永远不要记录机密信息、密码、令牌或完整的信用卡号 — 对敏感字段进行脱敏处理
- 基于错误率峰值而非单个错误进行告警 — 使用阈值(例如 5 分钟内错误率 >5%)
- Axiom/Datadog:通过 OTLP 或原生 SDK 发送日志,添加自定义指标以跟踪业务 KPI
- 健康检查端点:
GET /health 返回 { status: "ok" },并包含数据库连通性检查
- 监控响应时间的 p50、p95、p99 分位数 — 在 p95 恶化时触发告警
模式
import pino from "pino";
const logger = pino({ level: process.env.LOG_LEVEL || "info" });
logger.info({ userId, action: "checkout", orderId }, "订单已下单");
logger.error({ err, requestId }, "支付处理失败");
import * as Sentry from "@sentry/nextjs";
Sentry.init({ dsn: process.env.SENTRY_DSN, tracesSampleRate: 0.1 });
避免
- 在生产环境中使用
console.log — 改用结构化日志记录器
- 记录每个请求的请求体 — 记录摘要,而非负载
- 忽略未捕获的 Promise 拒绝 — 始终捕获它们
- 因频繁告警导致告警疲劳 — 调整阈值,对相似错误进行分组