温馨提示×

nodejs linux日志怎样切割

小樊
41
2026-09-02 12:49:29
栏目: 编程语言

在 Linux 下对 Node.js 日志进行切割,常见做法有下面几类,按推荐程度给你总结:


一、用日志库自带切割(最推荐 ✅)

1. winston + winston-daily-rotate-file

最常用、零运维

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({
      filename: 'logs/app-%DATE%.log',
      datePattern: 'YYYY-MM-DD',
      maxFiles: '14d',     // 保留 14 天
      maxSize: '20m'       // 单文件最大 20MB
    })
  ]
});

✅ 按天 / 大小自动切割
✅ 不需要额外进程
✅ 适合大多数 Node 服务


2. pino + pino-roll

性能最好(高并发首选)

npm install pino pino-roll
const pino = require('pino');
const { roll } = require('pino-roll');

const logger = pino(
  {},
  roll({
    file: 'logs/app.log',
    frequency: 'daily',
    size: '10M',
    mkdir: true
  })
);

✅ 极快
✅ 原生支持切割


二、用 Linux 系统工具(运维标准方案)

3. logrotate(生产环境标准 ✅)

不修改 Node 代码,只管输出到文件

Node 代码

const fs = require('fs');
const log = fs.createWriteStream('/var/log/node/app.log', { flags: 'a' });

logrotate 配置

/etc/logrotate.d/node-app

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

✅ 系统级方案
✅ 支持压缩、清理
⚠️ 必须用 copytruncate(Node 不重开文件)


三、用 PM2(如果你用 PM2)

4. PM2 日志管理

pm2 install pm2-logrotate
pm2 set pm2-logrotate:max_size 10M
pm2 set pm2-logrotate:retain 7

✅ 简单
✅ 适合 PM2 部署


四、不推荐方式 ❌

  • 自己写定时任务 mv
  • > log 重定向(会丢日志)
  • 单文件无限增长

选型建议

场景 推荐
普通 Node 服务 winston-daily-rotate-file
高并发 pino + pino-roll
生产服务器 logrotate
PM2 部署 pm2-logrotate

如果你愿意,我可以:

  • 给你 完整示例项目
  • Docker / K8s 场景设计
  • 帮你选 最合适方案

你现在是哪种部署方式?

0