温馨提示×

Linux如何切割Nodejs日志

小樊
33
2026-07-07 10:23:11
栏目: 编程语言

在 Linux 下切割 Node.js 日志,常见做法有 3 种
logrotate(最推荐)
PM2 自带日志切割
Node.js 代码内按天切割

下面按使用场景详细说明。


一、使用 logrotate(生产环境首选 ✅)

这是 最标准、最稳定 的方式,适合所有 Node.js 服务。

1️⃣ 假设日志路径

/var/log/myapp/
├── app.log
├── error.log

2️⃣ 创建 logrotate 配置

sudo vim /etc/logrotate.d/nodeapp

3️⃣ 配置示例

/var/log/myapp/*.log {
    daily
    rotate 30
    compress
    delaycompress
    missingok
    notifempty
    create 0644 node node
    copytruncate
}

4️⃣ 参数说明

参数 作用
daily 每天切割
rotate 30 保留 30 天
compress 压缩旧日志
copytruncate 不重启 Node.js 也能切割
missingok 日志不存在也不报错

5️⃣ 手动测试

sudo logrotate -vf /etc/logrotate.d/nodeapp

优点

  • 不依赖 Node.js 代码
  • 稳定、自动
  • 适合 Docker / 裸机 / 云服务器

二、使用 PM2 日志切割(PM2 用户推荐 ✅)

如果你用 PM2 管理 Node.js,这是最简单的方式。

1️⃣ 安装模块

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 set pm2-logrotate:dateFormat YYYY-MM-DD

3️⃣ 日志效果

~/.pm2/logs/
├── app-out-2026-01-21.log
├── app-out-2026-01-20.log.gz

优点

  • 零配置
  • 自动压缩
  • 适合 PM2 用户

⚠️ 缺点

  • 只能在 PM2 环境使用

三、Node.js 代码中按天切割(不推荐生产)

适合 小工具 / 临时脚本

示例(Winston)

const winston = require('winston');
const path = require('path');

const logger = winston.createLogger({
  transports: [
    new winston.transports.File({
      filename: path.join(
        __dirname,
        `logs/app-${new Date().toISOString().slice(0, 10)}.log`
      )
    })
  ]
});

❌ 缺点:

  • 重启才会切换日志
  • 不如 logrotate 稳定

四、Docker 场景(补充)

如果是 Docker + Node.js:

推荐

  • 日志输出到 stdout
  • 用 Docker log driver 或 logrotate
docker logs container_name > /var/log/node.log

或直接:

json-file + logrotate

五、推荐方案总结 ✅

场景 推荐方案
生产环境 ✅ logrotate
PM2 管理 ✅ pm2-logrotate
小脚本 代码切割
Docker stdout + logrotate

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

  • ✅ 是否使用 PM2
  • ✅ 是否 Docker
  • ✅ 日志路径
  • ✅ 日志大小 / 保留天数

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

0