CentOS环境下Node.js日志管理
一 核心要点与总体架构
- 在应用内使用成熟的日志库,优先选择结构化输出(如 JSON),便于检索与分析。常见选择:Winston、Pino、Bunyan、Log4js。
- 规范日志级别:DEBUG/INFO/WARN/ERROR/CRITICAL,按环境动态切换(开发输出 DEBUG,生产默认 INFO/ERROR)。
- 实施日志轮转:应用侧用如 winston-daily-rotate-file,系统侧用 logrotate,避免单文件无限增长。
- 集中化管理:将日志发送到 ELK Stack(Elasticsearch、Logstash、Kibana)、Graylog、Fluentd 等,便于检索、告警与可视化。
- 进程与系统日志:使用 PM2 统一托管与查看日志;若为 systemd 服务,用 journalctl 查看服务日志。
二 应用内日志库配置示例
- 使用 Winston 写入按天轮转的错误与全量日志(JSON 格式,便于后续分析):
const winston = require('winston');
const DailyRotateFile = require('winston-daily-rotate-file');
const logger = winston.createLogger({
level: 'info',
format: winston.format.combine(
winston.format.timestamp({ format: 'YYYY-MM-DD HH:mm:ss' }),
winston.format.json()
),
transports: [
new DailyRotateFile({
filename: 'logs/error-%DATE%.log',
datePattern: 'YYYY-MM-DD',
level: 'error',
zippedArchive: true,
maxFiles: '14'
}),
new DailyRotateFile({
filename: 'logs/combined-%DATE%.log',
datePattern: 'YYYY-MM-DD',
zippedArchive: true,
maxFiles: '14'
}),
new winston.transports.Console({ format: winston.format.simple() })
]
});
logger.info('服务启动', { port: 3000 });
logger.error('数据库连接失败', { err: 'timeout' });
- 其他可选库:Pino(高性能、低开销)、Bunyan(结构化 JSON)、Log4js(灵活的输出与布局)。
三 系统级日志轮转与保留策略
- 使用 logrotate 管理应用日志文件(推荐在系统层面统一轮转):
- 创建配置:/etc/logrotate.d/nodejs_app
/path/to/your/nodejs/app/logs/*.log {
daily
rotate 7
compress
missingok
notifempty
create 0640 nodejs nodejs
copytruncate
}
- 说明:
- daily:按天轮转;rotate 7:保留 7 天;compress:压缩旧日志;missingok:日志不存在不报错;notifempty:空文件不轮转。
- create 0640 nodejs nodejs:按实际运行用户/组设置权限与属主。
- copytruncate:复制后截断原文件,避免应用句柄未释放导致轮转失败(若应用支持 reopen 信号,可改用 postrotate 发送信号)。
- 测试与生效:
- 测试:sudo logrotate -d /etc/logrotate.d/nodejs_app(干跑)
- 强制执行:sudo logrotate -f /etc/logrotate.d/nodejs_app
- logrotate 默认由 cron 每日执行。
四 进程管理与系统日志查看
- 使用 PM2 托管与查看日志(适合多实例与集群):
- 安装:npm install -g pm2
- 启动:pm2 start app.js --name myapp
- 实时查看:pm2 logs myapp;查看最近 1000 行:pm2 logs myapp --lines 1000
- 保存与分割:PM2 自带日志轮转(基于时间与大小),可通过配置文件设置保留天数与分割策略。
- 使用 systemd 与 journalctl(若以服务运行):
- 查看服务日志:journalctl -u your-nodejs-service.service -f
- 按时间过滤:journalctl -u your-nodejs-service.service --since “2025-11-26 00:00:00”
五 集中式日志与可视化
- 方案选型:
- ELK Stack(Elasticsearch + Logstash + Kibana):采集、解析、存储与可视化一体化,适合复杂查询与仪表盘。
- Graylog:集中式日志平台,易部署、检索能力强。
- Fluentd:统一日志采集与转发,生态丰富。
- 接入方式:
- 应用内将日志以 JSON 输出到控制台或文件,由 Filebeat/rsyslog/Fluentd 采集并发送到 Logstash/Elasticsearch。
- 若需直接发送,可使用 winston-syslog 等传输器将日志发往 syslog/远程日志服务器。