温馨提示×

Ubuntu Nodejs日志如何分割

小樊
48
2026-08-05 10:10:56
栏目: 编程语言

在 Ubuntu 上,Node.js 日志分割常见有 3 种成熟方案,按推荐程度从低到高说明,并给出可直接用的配置示例。


一、最简单:用 pm2 自带日志分割(最常用 ✅)

如果你用 pm2 管理 Node.js 进程,强烈推荐直接用 pm2-logrotate

1️⃣ 安装 pm2-logrotate

pm2 install pm2-logrotate

2️⃣ 配置日志分割

pm2 set pm2-logrotate:max_size 10M
pm2 set pm2-logrotate:retain 7
pm2 set pm2-logrotate:compress true
pm2 set pm2-logrotate:dateFormat YYYY-MM-DD

含义:

  • max_size:单个日志最大 10MB
  • retain:保留最近 7 个日志
  • compress:压缩旧日志
  • dateFormat:日志文件名带日期

3️⃣ 日志路径

默认在:

~/.pm2/logs/

优点

  • 零代码改动
  • 自动按大小 + 时间切割
  • 生产环境最常用

二、系统级方案:使用 logrotate(适合所有 Node 服务)

适合 不用 pm2 或希望系统统一管理日志。

1️⃣ 创建 logrotate 配置

sudo vim /etc/logrotate.d/node-app

2️⃣ 示例配置

/var/log/node/app.log {
    daily
    rotate 7
    size 50M
    missingok
    notifempty
    compress
    delaycompress
    copytruncate
}

3️⃣ 配置说明

参数 说明
daily 每天切割
rotate 7 保留 7 份
size 50M 超过 50M 也切
copytruncate 不重启 Node 也能切
compress gzip 压缩

4️⃣ 测试

sudo logrotate -d /etc/logrotate.d/node-app

优点

  • 系统级标准方案
  • 不依赖第三方库

⚠️ 注意:
copytruncate 在极端高并发下可能有极少量日志丢失


三、Node.js 代码级方案(不推荐单独使用)

使用 winston + winston-daily-rotate-file

安装

npm install winston winston-daily-rotate-file

示例

const winston = require('winston');
const DailyRotateFile = require('winston-daily-rotate-file');

const transport = new DailyRotateFile({
  dirname: 'logs',
  filename: 'app-%DATE%.log',
  datePattern: 'YYYY-MM-DD',
  maxSize: '10m',
  maxFiles: '7d'
});

const logger = winston.createLogger({
  transports: [transport]
});

logger.info('hello node log');

适合

  • 需要按日期命名
  • Docker / 云函数环境

缺点

  • 增加代码复杂度
  • 不如 pm2 / logrotate 稳定

四、方案对比(怎么选?)

场景 推荐方案
pm2 管理 Node ✅ pm2-logrotate
系统服务 / systemd ✅ logrotate
Docker 容器 winston-daily-rotate
简单脚本 logrotate

五、最佳实践(生产建议)

✅ Node.js 只管打日志
✅ 日志切割 交给 pm2 或系统
✅ 日志目录统一:

/var/log/node/

如果你愿意,可以告诉我:

  • ✅ 是否使用 pm2
  • ✅ 日志路径
  • ✅ 是否 Docker / systemd

我可以帮你 直接生成一份可用配置

0