日誌與監控
規則
- 結構化日誌:JSON 格式,包含
timestamp、level、message、requestId、userId 欄位
- 日誌層級:
error(損壞)、warn(降級)、info(業務事件)、debug(僅開發用)
- 使用 Pino 進行 Node.js 日誌記錄 — 快速、結構化、預設輸出 JSON
- 使用 Sentry 進行錯誤追蹤:盡早初始化、捕捉未處理的例外、加入使用者上下文和 breadcrumbs
- 使用請求 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 拒絕 — 務必捕捉它們
- 因雜訊過多的警示而導致警示疲勞 — 調整閾值,將類似的錯誤分組