Ubuntu Node.js 日志存储策略与最佳实践
一 策略总览
- 采用结构化日志(JSON),便于检索、分析与可视化;优先选择高性能库如 Pino、Winston,在高并发下可显著降低日志开销。
- 实施日志轮转与压缩归档,按时间与大小双维度控制,避免单文件过大与数量失控。
- 区分环境级别:生产仅记录 warn/error,开发/测试可开启 debug/info。
- 坚持异步写入,避免阻塞事件循环;对外部系统日志(如 Nginx、systemd)采用集中化采集。
- 将日志落盘在SSD或高性能存储,并配置监控与告警,防止磁盘被日志打满。
- 多实例/多服务器场景使用集中式日志管理(如 ELK/Graylog),减少本地存储压力并提升可观测性。
二 日志库与级别配置
| 库 |
主要特点 |
适用场景 |
| Pino |
极高性能、默认 JSON、流式友好 |
高并发/低开销 生产服务 |
| Winston |
多传输、灵活格式化、生态完善 |
需要多目标输出与复杂策略 |
| Bunyan |
结构化 JSON、CLI 工具 |
需要标准化结构与可读性 |
| Log4js |
灵活配置、多输出 |
迁移自 Java/log4j 体系 |
- 级别与输出建议
- 生产:最低级别设为 warn,错误单独落盘;非生产可输出到控制台便于排查。
- 结构化输出示例(Winston):
- 安装:
npm i winston
- 配置:
- const winston = require(‘winston’);
- const logger = winston.createLogger({
level: process.env.NODE_ENV === ‘production’ ? ‘warn’ : ‘debug’,
format: winston.format.json(),
transports: [
new winston.transports.File({ filename: ‘error.log’, level: ‘error’ }),
new winston.transports.File({ filename: ‘combined.log’ }),
…(process.env.NODE_ENV !== ‘production’ ? [new winston.transports.Console({ format: winston.format.simple() })] : [])
]
});
- 性能要点:保持异步写入;避免同步 I/O;必要时对日志字段做采样/降级。
三 轮转与保留策略
- 系统级 Logrotate(通用、无需改代码)
- 配置路径:
/etc/logrotate.d/node-app
- 示例策略:
- /var/log/nodejs/*.log {
daily
rotate 7
compress
missingok
notifempty
create 0640 root adm
copytruncate
}
- 说明:
- daily/rotate 7/compress 控制按天轮转并保留 7 天;
- copytruncate 适用于无法重启进程的场景(先复制再清空原文件);
- 测试:
sudo logrotate -f /etc/logrotate.d/node-app。
- 库内置轮转(应用内控制)
- Winston + daily-rotate-file:
- 安装:
npm i winston-daily-rotate-file
- 配置:
- const DailyRotateFile = require(‘winston-daily-rotate-file’);
- const transport = new DailyRotateFile({
filename: ‘/var/log/nodejs/app-%DATE%.log’,
datePattern: ‘YYYY-MM-DD’,
zippedArchive: true,
maxSize: ‘100m’,
maxFiles: ‘30d’
});
- PM2 管理场景:启用 pm2-logrotate 插件
- 设置:
pm2 set pm2-logrotate:max_size 10M、pm2 set pm2-logrotate:retain 7。
- 保留策略建议
- 按时间:常规业务保留 7–30 天;合规/审计场景按需延长并异地归档。
- 按大小:单文件建议 10–100 MB,结合压缩与保留天数控制总量。
四 存储与目录规范
- 目录与权限:统一落盘到 /var/log/nodejs/,权限 0640,属主 root:adm,便于系统统一管理。
- 存储硬件:优先 SSD/NVMe,提升高并发写入与检索性能。
- 系统日志联动:
- 使用 journalctl 管理 systemd 日志(如:
journalctl --vacuum-size=100M 控制 systemd 日志体积);
- 非阻塞查看:
journalctl -u your-app.service -f。
- 容量与清理:
- 观测:
du -sh /var/log/nodejs/*、df -h;
- 清理:按保留策略定期删除旧日志,避免磁盘占满导致服务异常。
五 集中化与监控告警
- 集中化采集与可视化
- 自建:ELK Stack(Elasticsearch+Logstash+Kibana) 或 Graylog,统一收集、解析、存储与可视化;
- 托管/轻量:Loggly、Grafana Loki(低成本、与 Prometheus/Grafana 生态契合)。
- 进程与多实例管理
- 使用 PM2 聚合多进程日志:
pm2 logs;结合 pm2-logrotate 控制本地保留。
- 监控与告警
- 资源与日志联动监控:PM2、Datadog、New Relic、Prometheus;
- 关键指标:磁盘使用率、日志写入速率、错误率、P95/P99 延迟;
- 建议设置磁盘阈值告警(如 ≥80% 预警、≥90% 紧急),并配置自动清理/扩容流程。