Node.js 在 Ubuntu 的日志存储策略
总体说明
在 Ubuntu 上,Node.js 并没有统一的“内置”日志策略,通常由应用自身与操作系统共同决定:应用通过日志库写入文件或标准输出,Ubuntu 提供日志轮转、系统日志收集与集中化管理能力。实践中常见的组合是:在 Node.js 中使用结构化日志库(如 Winston、Pino、Bunyan、Log4js),配合按时间或大小进行轮转;在系统层面用 logrotate 或 PM2 做文件轮转与保留;需要统一检索与告警时,再接入 rsyslog 或 ELK/Graylog 等集中式方案。
核心策略一览
- 日志库与级别
- 库:优先选择 Winston、Pino、Bunyan、Log4js;HTTP 请求日志可用 Morgan 与 Express 集成。
- 级别:按环境区分,生产建议 warn/error,开发可 debug;常用级别包含 fatal、error、warn、info、debug、trace。
- 输出与格式
- 同时输出到 stdout/stderr 与文件,便于容器/进程管理与本地排查。
- 采用 JSON 结构化日志,便于检索、分析与可视化。
- 存储位置与权限
- 应用日志建议写入 /var/log/yourapp/(需确保运行用户对目录有写权限),并按环境与类型分文件(如 error.log、combined.log)。
- 轮转与保留
- 应用内轮转:如 winston-daily-rotate-file,支持按天/大小切分、压缩与保留天数。
- 系统级轮转:用 logrotate 统一管理,支持 daily、rotate N、compress、delaycompress、missingok、create、postrotate 等策略。
- 进程管理
- 使用 PM2 时,可启用其日志聚合与内置轮转,简化多实例场景的日志收集。
- 集中化与告警
- 通过 rsyslog/syslog-ng 将日志送入系统日志或远程日志中心;复杂场景接入 ELK(Elasticsearch、Logstash、Kibana) 或 Graylog 做检索、可视化与告警。
落地配置示例
- 应用内按天轮转(Winston + winston-daily-rotate-file)
- 安装:npm i winston winston-daily-rotate-file
- 示例:
- const { createLogger, format, transports } = require(‘winston’);
const DailyRotateFile = require(‘winston-daily-rotate-file’);
const logger = createLogger({
level: process.env.NODE_ENV === ‘production’ ? ‘warn’ : ‘debug’,
format: format.combine(format.timestamp(), format.json()),
transports: [
new transports.Console(),
new DailyRotateFile({
filename: ‘/var/log/myapp/application-%DATE%.log’,
datePattern: ‘YYYY-MM-DD’,
zippedArchive: true,
maxSize: ‘20m’,
maxFiles: ‘14d’
}),
new DailyRotateFile({
filename: ‘/var/log/myapp/error-%DATE%.log’,
datePattern: ‘YYYY-MM-DD’,
level: ‘error’,
zippedArchive: true,
maxFiles: ‘30d’
})
]
});
- 系统级轮转(logrotate 示例)
- 新建配置:/etc/logrotate.d/myapp
- /var/log/myapp/*.log {
daily
missingok
rotate 14
compress
delaycompress
ifempty
create 0640 www-data www-data
sharedscripts
postrotate
systemctl reload myapp.service >/dev/null 2>&1 || true
endscript
}
- 测试与生效:
- sudo logrotate -vf /etc/logrotate.conf
- 通常每日由 /etc/cron.daily/logrotate 自动执行
运维与合规要点
- 安全合规
- 严禁记录 密码、身份证号、手机号、银行卡号 等敏感信息;必要时对日志脱敏或做最小化记录。
- 性能与成本
- 控制日志级别与采样,避免过量日志影响性能与磁盘;对历史日志做压缩与冷归档。
- 监控与告警
- 结合 ELK/Graylog 或第三方服务(如 Sentry)建立错误告警与可视化看板,缩短 MTTR。
- 审计与保留
- 依据业务与合规要求设置保留周期(如 14–90 天),并建立定期清理与归档流程。