温馨提示×

如何轮转debian nodejs日志

小樊
45
2026-10-21 18:42:20
栏目: 编程语言

在 Debian 上“轮转 Node.js 日志”通常分两种情况:Node.js 自身产生的日志(如 console.log 写文件、PM2 日志、应用内日志库),以及系统级日志轮转。最推荐的是使用 Debian 自带的 logrotate。

下面按常见场景说明。


一、使用 logrotate(推荐,系统级标准方案)

1. 安装 logrotate(一般已默认安装)

sudo apt update
sudo apt install logrotate

2. 假设你的 Node.js 日志路径

例如:

/var/log/nodeapp/app.log

3. 创建 logrotate 配置

sudo nano /etc/logrotate.d/nodeapp

示例配置:

/var/log/nodeapp/*.log {
    daily
    missingok
    rotate 14
    compress
    delaycompress
    notifempty
    copytruncate
}

参数说明

  • daily:每天轮转
  • rotate 14:保留 14 份
  • compress:压缩旧日志
  • copytruncate:不重启 Node.js 直接截断日志(最常用)
  • notifempty:空日志不轮转

✅ copytruncate 对 Node.js 非常重要,因为 Node 默认不会重新打开日志文件


二、如果使用 PM2

PM2 自带日志,但仍需 logrotate

1. 安装 PM2 logrotate

pm2 install pm2-logrotate

2. 配置示例

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

日志位置:

~/.pm2/logs/

三、Node.js 应用内日志(Winston / Pino)

Winston 示例(自动轮转)

npm install winston winston-daily-rotate-file
const transport = new (require('winston-daily-rotate-file'))({
  filename: '/var/log/nodeapp/app-%DATE%.log',
  datePattern: 'YYYY-MM-DD',
  maxFiles: '14d',
  zippedArchive: true
});

✅ 不需要 logrotate


四、手动测试 logrotate

sudo logrotate -d /etc/logrotate.d/nodeapp  # 模拟
sudo logrotate -f /etc/logrotate.d/nodeapp  # 强制执行

五、常见问题

Node.js 日志不轮转?

  • 没用 copytruncate
  • Node 写的是 stdout 而非文件
  • 权限不足(log 目录属主不对)

systemd 服务日志?

journalctl -u nodeapp

由 systemd-journald 管理,不靠 logrotate


如果你能告诉我:

  • 用 PM2 / Docker / systemd / 裸 Node
  • 日志是 文件还是 stdout

我可以给你精准配置。

0 踩