温馨提示×

nodejs linux日志轮转怎么配置

小樊
40
2026-10-23 02:39:05
栏目: 编程语言

在 Node.js 服务运行于 Linux 时,日志轮转(log rotation)通常不靠 Node.js 自身实现,而是由 Linux 的日志管理工具完成。最常见的是 logrotate。下面分几种常见场景说明。


一、使用 logrotate(推荐,最常用)

1. 安装 logrotate(一般系统自带)

which logrotate
# 通常在 /usr/sbin/logrotate

2. 示例:Node.js 日志文件

假设日志路径:

/var/log/myapp/app.log

3. 创建 logrotate 配置文件

sudo vim /etc/logrotate.d/myapp

内容示例:

/var/log/myapp/app.log {
    daily
    missingok
    rotate 14
    compress
    delaycompress
    notifempty
    copytruncate
}

参数说明

参数 作用
daily 每天轮转
rotate 14 保留 14 个历史日志
compress 压缩旧日志
delaycompress 延迟压缩(避免刚轮转就压)
notifempty 日志为空不轮转
copytruncate 复制后清空原文件(Node.js 不停服关键

✅ Node.js 必用 copytruncate
否则 Node.js 仍持有旧文件句柄,日志不会写入新文件


二、配合 PM2(非常常见)

如果你用 PM2 启动 Node.js:

PM2 自带日志

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

logrotate 示例

/home/*/.pm2/logs/*.log {
    daily
    rotate 7
    compress
    delaycompress
    notifempty
    copytruncate
}

或针对单个应用:

/root/.pm2/logs/myapp-*.log {
    daily
    rotate 7
    compress
    copytruncate
}

三、Node.js 内部实现日志轮转(不推荐但可选)

如果你不想用 logrotate:

使用库

  • winston
  • winston-daily-rotate-file
  • pino
  • rotating-file-stream

示例(winston):

const { createLogger, transports } = require('winston');
const DailyRotateFile = require('winston-daily-rotate-file');

createLogger({
  transports: [
    new DailyRotateFile({
      filename: 'logs/app-%DATE%.log',
      datePattern: 'YYYY-MM-DD',
      maxFiles: '14d'
    })
  ]
});

⚠️ 缺点:

  • 增加 Node.js 复杂度
  • 多进程下需要额外处理

四、systemd 服务场景(可选)

若用 systemd:

[Service]
StandardOutput=append:/var/log/myapp/app.log
StandardError=append:/var/log/myapp/error.log

再配合 logrotate 即可。


五、测试 logrotate

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

总结建议

✅ 最佳实践

  • Node.js 只负责写日志
  • Linux 用 logrotate + copytruncate
  • 生产环境配合 PM2 / systemd

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

  • 是否用 PM2
  • 单进程还是集群
  • 日志路径

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

0 踩