日志
winston、morgan、logging。
25 分钟
日志
线上排障靠 结构化日志,不是 console.log 堆砌。Node 生态常见 Pino(Fastify 默认)、Winston、Morgan(HTTP 访问日志) 组合使用。
学习目标
- 理解结构化 JSON 日志字段
- 在 Fastify 中用 pino 记录请求与错误
- 区分 access log 与 application log
Pino(推荐配合 Fastify)
const app = Fastify({
logger: {
level: process.env.LOG_LEVEL || "info",
},
});
app.get("/api/tracks/:slug", async (request) => {
request.log.info({ slug: request.params.slug }, "fetch track");
return { slug: request.params.slug };
});
输出单行 JSON,便于 ELK、Loki、CloudWatch 检索。不要在 log 里写密码、token、完整信用卡号。
Winston 与 Morgan
import winston from "winston";
export const logger = winston.createLogger({
level: "info",
format: winston.format.json(),
transports: [new winston.transports.Console()],
});
// Express 访问日志
import morgan from "morgan";
app.use(morgan("combined"));
| 工具 | 用途 |
|---|---|
| pino | 高性能应用日志,Fastify 内置 |
| winston | 灵活 transport(文件、远程) |
| morgan | HTTP 访问行(method、url、status) |
实践纪律
- 每个请求带 requestId(中间件生成,全链路透传)
- 错误 log 带
err对象栈,对外 API 仍返回统一 JSON(见 node-errors) - 日志级别:
debug开发、info正常、warn可恢复、error需跟进
生产采集与轮转见 nodejs-advanced-essentials 与 docker-essentials。
练习
- 开启 Fastify logger,观察一条 POST 的 JSON 输出
- 用 winston 写文件 transport(本地
logs/app.log) - 列出你项目「绝不能进日志」的三类字段
小结
下一课 pm2 与 cluster 概念。