温馨提示×

nodejs日志debian如何轮转

小樊
33
2026-09-19 08:44:45
栏目: 编程语言

在 Debian 上给 Node.js 日志做轮转(log rotation),最常用、最推荐的方式是结合 logrotate(系统自带)或者使用 Node.js 自身日志库。下面分几种常见情况说明。


一、使用系统 logrotate(推荐,最省心)

1. 假设 Node.js 日志位置

例如:

/var/log/myapp/app.log

2. 创建 logrotate 配置文件

新建文件:

sudo nano /etc/logrotate.d/myapp

示例配置:

/var/log/myapp/*.log {
    daily
    missingok
    rotate 14
    compress
    delaycompress
    notifempty
    create 0640 node node
    sharedscripts
    postrotate
        # 让 Node.js 重新打开日志文件(关键)
        pkill -USR1 -f "node /path/to/app.js"
    endscript
}

3. 关键说明

  • daily:每天轮转(也可 weekly / size 50M
  • rotate 14:保留 14 份
  • compress:压缩旧日志
  • pkill -USR1
    • 如果 Node.js 使用 原生 fs 写日志,必须通知进程重新打开文件
    • PM2 不需要这一步

4. 手动测试

sudo logrotate -d /etc/logrotate.d/myapp  # 测试(不实际执行)
sudo logrotate -f /etc/logrotate.d/myapp  # 强制执行

二、使用 PM2(非常常见)

如果你用 PM2 启动 Node.js:

1. PM2 自带日志

~/.pm2/logs/app-out.log
~/.pm2/logs/app-error.log

2. PM2 日志轮转模块

pm2 install pm2-logrotate

常用配置:

pm2 set pm2-logrotate:max_size 10M
pm2 set pm2-logrotate:retain 30
pm2 set pm2-logrotate:compress true

✅ 不需要 logrotate
✅ 自动处理文件句柄


三、Node.js 代码层面(不推荐单独用)

如果你自己写日志(如 fs.appendFile):

setInterval(() => {
  process.kill(process.pid, 'SIGUSR1');
}, 86400000);

⚠️ 容易出错,一般配合 logrotate 使用


四、使用 Winston + Daily Rotate File(纯 Node 方案)

npm install winston winston-daily-rotate-file
const winston = require('winston');
const { DailyRotateFile } = require('winston-daily-rotate-file');

const logger = winston.createLogger({
  transports: [
    new DailyRotateFile({
      dirname: '/var/log/myapp',
      filename: 'app-%DATE%.log',
      datePattern: 'YYYY-MM-DD',
      maxFiles: '14d',
      zippedArchive: true
    })
  ]
});

✅ 不需要系统 logrotate
✅ 适合容器 / PaaS


推荐选择总结

场景 推荐方式
服务器长期运行 logrotate
PM2 管理 pm2-logrotate
Docker / 容器 winston-daily-rotate-file
简单脚本 logrotate

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

  • 是否用 PM2?
  • 日志路径?
  • 每天日志大概多大?

我可以直接帮你写一份可用的配置。

0