CentOS 上 Node.js 日志处理最佳实践
一 日志采集与输出
- 在应用内使用成熟的日志库,推荐 Winston、Bunyan、Log4js,便于分级输出、结构化(如 JSON)与多目标输出(控制台、文件、远程)。示例(Winston):
- 安装:
npm i winston
- 配置:
- const winston = require(‘winston’);
const logger = winston.createLogger({
level: ‘info’,
format: winston.format.combine(
winston.format.timestamp(),
winston.format.json()
),
transports: [
new winston.transports.Console(),
new winston.transports.File({ filename: ‘/var/log/myapp/app.log’ })
]
});
- 结构化日志(JSON)便于后续检索、分析与可视化;生产环境建议将日志级别设为 info,调试阶段用 debug。
二 日志轮转
- 系统级方案 logrotate(推荐)
- 安装:
sudo yum install -y logrotate(CentOS 通常已预装)
- 新建配置:
sudo vim /etc/logrotate.d/nodejs-app
- 示例配置(按天轮转、保留 7 天、压缩、自动重建):
- /var/log/myapp/*.log {
daily
rotate 7
compress
missingok
notifempty
create 0640 node node
copytruncate
dateext
}
- 说明:
- copytruncate 适用于持续写入的 Node.js 文件句柄场景,避免重启应用;若应用支持信号重开日志(如 SIGUSR1),可去掉 copytruncate 并配合 postrotate 执行重开。
- dateext 为归档文件添加日期后缀,便于追溯。
- 测试:
sudo logrotate -f /etc/logrotate.d/nodejs-app
- 进程管理方案 PM2 内置日志轮转
- 安装插件:
pm2 install pm2-logrotate
- 常用策略:
pm2 set pm2-logrotate:max_size 10M、pm2 set pm2-logrotate:retain 7、pm2 set pm2-logrotate:compress true、pm2 set pm2-logrotate:rotateInterval "0 0 * * *"
- 说明:PM2 会在 ~/.pm2/logs/ 下生成并轮转日志,适合使用 PM2 部署的场景。
- 应用内轮转(备选)
- 使用 winston-daily-rotate-file 等库在代码中按时间/大小切分,适合容器或无 systemd 场景,但对进程内文件句柄管理有要求。
三 集中式日志与远程传输
- 使用 rsyslog 将日志发往远程日志服务器(UDP 514)
- 服务端启用 UDP 模块并重启:
sudo systemctl restart rsyslog
- 客户端配置
/etc/rsyslog.d/nodejs.conf:
- . @remote_log_server_ip:514
- 应用侧可用 winston-syslog 将日志直接发往 syslog。
- 使用 ELK Stack(Elasticsearch、Logstash、Kibana) 或 Graylog 做集中存储、检索与可视化,适合大规模与多服务环境。
四 清理与维护
- 自动清理
- 基于时间的清理(cron + find):
0 0 * * * find /var/log/myapp -type f -name "*.gz" -mtime +7 -delete
- 说明:与 logrotate 的保留策略保持一致,避免重复删除或误删。
- 监控与告警
- 监控日志目录容量(如 /var/log)与 inode 使用率,防止因日志占满磁盘导致服务异常。
- 对 error 级别日志设定阈值告警,缩短故障发现时间。
- 权限与安全
- 运行 Node.js 的用户(如 node)应仅对日志目录具备写入权限;日志文件权限建议 0640,属主属组与运行用户一致,避免敏感信息泄露。
五 快速落地清单
- 选择日志库与级别:如 Winston + JSON + info/debug 分级。
- 输出目标:控制台(便于本地调试)+ 文件(如 /var/log/myapp/app.log)。
- 轮转策略:优先用 logrotate(daily/rotate 7/compress/copytruncate/dateext),PM2 场景用内置轮转插件。
- 远程与集中:中小规模先用 rsyslog 发到集中服务器;规模扩大引入 ELK/Graylog。
- 清理与监控:cron 清理旧归档、容量与 inode 监控、error 告警。