在生产环境中跑 Node.js 应用,日志管理是件绕不开的事——你总得知道应用在干嘛、出了什么问题、从哪里查起。但说实话,很多人要么直接扔到控制台,要么随便写个文件不管了,等到磁盘爆了或者排查故障时才发现一团乱。这篇指南就把 CentOS 上 Node.js 日志管理的常见做法和要点捋一捋,从输出位置、轮转清理到结构化、集中化,一步到位。

一、日志输出与存放位置
- 直接运行 Node.js 时,默认日志只输出到控制台。你要是想写入文件,可以在代码里配一个日志库,也可以直接用 shell 重定向:
node app.js > logs/app.log 2>&1。简单粗暴,但适合临时调试。 - 用 PM2 管理进程的话,日志默认落在
/root/.pm2/logs/目录下,文件名通常会包含应用名和-err.log、-out.log后缀,找起来很直观。 - 如果 Node.js 被注册为 systemd 服务,那就用
journalctl -u your-nodejs-service-name -t来查看日志,这是 CentOS 上的标准做法。 - 系统日志目录(比如
/var/log/下的 messages、secure)通常给系统组件用,不建议直接把应用日志写进去,除非你通过 syslog 协议做统一对接,否则容易混淆。
二、日志轮转与清理
日志只写不删,磁盘迟早要崩。轮转和清理是必须上的措施,下面几种方案可以按需选。
- 应用内轮转:推荐用
winston-daily-rotate-file,可以按天或按文件大小切分,还支持自动压缩与归档。关键参数包括filename、datePattern、zippedArchive: true、maxSize、maxFiles。这种方式跟系统级方案可以二选一,也可以组合使用。 - 系统级轮转:用
logrotate管理 Node.js 日志文件。典型策略是每天轮转、压缩旧日志、保留固定天数。示例配置放在/etc/logrotate.d/nodejs_app:
配置写好后,可以用/path/to/your/nodejs/app/logs/*.log { daily rotate 7 compress missingok notifempty create 0640 root root }sudo logrotate -f /etc/logrotate.d/nodejs_app强制运行一次来验证语法和行为,logrotate 默认由 cron.daily 每天自动执行。 - 清理策略:除了轮转保留天数,还可以用 cron 定期删除超期日志。比如每天凌晨 2:00 清理 7 天前的
.log文件:0 2 * * * find /path/to/logs -type f -name "*.log" -mtime +7 -delete - 如果用的是 PM2,可以安装
pm2-logrotate插件,按大小或按时间切割并保留指定份数,配置起来也很方便。
三、日志级别与结构化
- 日志级别要合理设置:开发环境可以开 debug,生产环境建议用 info、warn、error 三级就够了,否则会产生大量无用日志,既影响性能又浪费存储。
- 推荐采用结构化日志,比如用 JSON 格式输出,这样后续检索、分析会方便很多。常见的日志库有 Winston、Pino、Bunyan、Log4js。你可以按级别分流输出到不同文件,比如
error.log只记录 error 级别,combined.log记录所有级别。
四、集中式日志与系统日志对接
- 当应用数量多起来之后,每台机器单独看日志效率太低。集中式日志平台(比如 ELK Stack:Elasticsearch、Logstash、Kibana,或者 Graylog)可以帮你统一检索、可视化和告警。
- 对接 syslog 也是一种常见方式:用 rsyslog 把日志发到本地或远程 syslog 服务;Node.js 这端可以借助
winston-syslog等传输器直接输出到 syslog。 - 如果你的 Node.js 应用是以 systemd 服务的形式运行,可以把
StandardOutput/StandardError设为syslog,并通过SyslogIdentifier来标识应用名称,这样就能统一纳入系统的日志体系了。
五、常用命令与快速排查
- 查看 systemd 服务日志:
journalctl -u your-nodejs-service-name -t,可以按时间、服务名检索。 - 查看 PM2 日志:
pm2 logs your-app-name,实时 tail 输出,支持按应用名过滤。 - 验证 logrotate 配置:
sudo logrotate -f /etc/logrotate.d/nodejs_app,强制运行一次就能知道配置有没有写错。