Node.js 应用在 Linux 上的日志管理通常遵循**“应用层 + 系统层 + 运维层”三层结合的策略。下面从基本原则、常见方案、具体实践**几个层面系统说明。
分级输出
error:异常、崩溃warn:可预期但不正常info:业务流程debug:调试信息(生产环境关闭)结构化日志(推荐 JSON)
{
"level": "error",
"message": "DB connection failed",
"service": "user-service",
"time": "2026-01-20T10:01:00.000Z"
}
不要只写 console.log
日志与业务解耦
| 库 | 特点 |
|---|---|
| Winston | 最常用,插件多 |
| Pino | 高性能,JSON 友好 |
| Bunyan | JSON 原生,偏老 |
| Morgan | HTTP 请求日志 |
✅ 推荐组合
MorganPino 或 Winstonconst pino = require('pino');
const logger = pino({
level: 'info',
transport: {
target: 'pino-pretty', // 本地开发
},
});
logger.info('Server started');
logger.error({ err }, 'DB error');
生产环境:
const logger = pino({
level: 'info',
});
Pino 输出到 stdout,由 Linux 处理日志写入。
✅ 最佳实践
app stdout → systemd / Docker → log system
Node.js 作为 systemd 服务运行:
[Service]
ExecStart=/usr/bin/node /app/server.js
StandardOutput=journal
StandardError=journal
查看日志:
journalctl -u app -f
✅ 优点
应用写入文件:
{
transports: [
new winston.transports.File({ filename: '/var/log/app/app.log' })
]
}
/etc/logrotate.d/app:
/var/log/app/*.log {
daily
rotate 7
compress
missingok
notifempty
copytruncate
}
⚠️ 不推荐用于高并发场景(文件锁、性能)
Node.js
↓ stdout
systemd
↓ journald
↓
journalctl / 转发到 ELK
✅ 优点
Node.js
↓ stdout
Docker
↓ json-file / syslog / journald
docker logs app
Node.js → stdout
→ Filebeat / Fluent Bit
→ Elasticsearch / Loki
→ Kibana / Grafana
✅ 必须包含
✅ HTTP 日志
GET /api/user 200 32ms
如果你愿意,我可以:
你可以直接告诉我你的部署方式(裸机 / Docker / K8s)。