Node.js在CentOS上如何日志管理
小樊
47
2026-01-10 00:26:48
Node.js 在 CentOS 的日志管理实践
一 日志采集与结构化
在应用内使用成熟的日志库,优先选择结构化输出(如 JSON ),便于检索与分析。常见选择:Winston 、Pino 、Bunyan 、Log4js 。示例(Winston,按天轮转):
安装:npm i winston winston-daily-rotate-file
配置:
const winston = require(‘winston’);
const { createLogger, format, transports } = winston;
const DailyRotateFile = require(‘winston-daily-rotate-file’);
const logger = createLogger({
level: ‘info’,
format: format.combine(
format.timestamp({ format: ‘YYYY-MM-DD HH:mm:ss’ }),
format.json()
),
transports: [
new DailyRotateFile({
filename: ‘/var/log/myapp/application-%DATE%.log’,
datePattern: ‘YYYY-MM-DD’,
zippedArchive: true,
maxSize: ‘20m’,
maxFiles: ‘14d’
}),
new transports.Console()
]
});
logger.info(‘hello world’, { route: ‘/health’ });
若使用 PM2 托管进程,可直接利用其内置日志能力(见下一节)。
二 日志轮转与清理
使用系统自带的 logrotate (CentOS 通常已预装):
新建配置:sudo vim /etc/logrotate.d/node-app
示例(按天轮转、保留 7 天、压缩、空文件不轮转、自动创建新文件并设置权限):
/var/log/myapp/*.log {
daily
rotate 7
compress
missingok
notifempty
create 0640 myapp myapp
}
测试:sudo logrotate -f /etc/logrotate.d/node-app
使用 PM2 内置日志轮转 (适合 PM2 场景):
启用:pm2 install pm2-logrotate
常用策略:pm2 set pm2-logrotate:max_size 10M(单文件达 10MB 轮转)、pm2 set pm2-logrotate:retain 7(保留 7 个历史)、pm2 set pm2-logrotate:compress true(压缩)、pm2 set pm2-logrotate:rotateInterval "0 0 * * *"(每日 00:00 轮转)
不使用 PM2 时的轻量替代:cron + find 清理旧日志
示例(删除 7 天前的 .log):0 0 * * * find /var/log/myapp -type f -name "*.log" -mtime +7 -delete
选择建议:使用 PM2 时优先用其内置轮转;裸进程或无侵入需求时优先用 logrotate ;极简环境可用 cron 。
三 集中式日志与可视化
将日志汇聚到集中式平台,便于检索、告警与可视化:
ELK Stack(Elasticsearch + Logstash + Kibana) :强大的全文检索与可视化能力,适合复杂分析与仪表盘。
Graylog :企业级集中式日志管理,部署相对简单。
Splunk :商业方案,功能完备、生态成熟。
Grafana Loki :与 Grafana 深度集成,成本友好,适合云原生与微服务。
若服务由 systemd 托管,也可结合 journalctl 统一查看服务标准输出与错误输出,作为系统侧补充。
四 落地配置示例
场景:Node.js + PM2 + logrotate + ELK
应用内(Winston,JSON,便于 Logstash 解析):
安装:npm i winston winston-daily-rotate-file
配置要点:输出到 /var/log/myapp/app.log 与 error.log,按天轮转、压缩、保留 14 天;控制台同步输出便于本地排查。
进程侧(PM2):
启动:pm2 start app.js -n myapp
日志轮转: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 * * *"
系统侧(logrotate,兜底清理与权限统一):
/var/log/myapp/*.log { daily; rotate 7; compress; missingok; notifempty; create 0640 myapp myapp }
集中式(ELK):
Filebeat 采集 /var/log/myapp/*.log → Logstash(解析 JSON、补充字段) → Elasticsearch(存储与检索) → Kibana(仪表盘与告警)。