温馨提示×

如何分割Nodejs日志文件

小樊
37
2026-08-02 14:26:20
栏目: 编程语言

在 Node.js 里分割日志文件通常有几种常见做法,取决于你用的是 原生日志、第三方日志库,还是运行环境(Linux / Docker / PM2)。下面按推荐程度给你一个完整方案。


一、最推荐方案:使用日志库 + 自动按日期/大小分割 ✅

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 transport = new DailyRotateFile({
  dirname: 'logs',
  filename: 'app-%DATE%.log',
  datePattern: 'YYYY-MM-DD',
  maxSize: '20m',        // 单文件最大 20MB
  maxFiles: '14d',       // 保留 14 天
  zippedArchive: true    // 压缩旧日志
});

const logger = winston.createLogger({
  level: 'info',
  format: winston.format.combine(
    winston.format.timestamp(),
    winston.format.json()
  ),
  transports: [
    transport,
    new winston.transports.Console()
  ]
});

logger.info('Hello log');

✅ 优点:

  • 自动按 日期 / 大小 分割
  • 自动删除旧日志
  • 生产环境最常用

二、使用 PM2 分割日志(适合部署环境)✅

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

1️⃣ 安装 PM2

npm install pm2 -g

2️⃣ 启动应用

pm2 start app.js --name my-app

3️⃣ 安装日志分割插件

pm2 install pm2-logrotate

4️⃣ 配置日志大小

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

✅ 优点:

  • 不需要改代码
  • 非常适合服务器部署

三、Linux 系统级方案:logrotate(服务器标准做法)✅

适合 直接运行 Node.js 或 Docker 容器

示例 /etc/logrotate.d/node-app

/var/log/node/app.log {
    daily
    rotate 7
    size 50M
    missingok
    notifempty
    compress
    copytruncate
}

✅ 优点:

  • 系统级、稳定
  • 不依赖 Node.js 代码

⚠️ 注意:

  • copytruncate 可能会导致极少量日志丢失

四、使用 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',
    limit: 7
  })
);

✅ 优点:

  • 非常快
  • 磁盘占用小

五、不推荐方案 ❌

方案 原因
自己写 fs.appendFile 容易丢日志、难维护
单文件无限增长 磁盘会被打满
console.log 上生产 不可控、不可分割

六、如何选择?✅ 快速建议

场景 推荐方案
普通 Node.js 项目 winston + daily-rotate-file
PM2 部署 pm2-logrotate
服务器运维 logrotate
高性能服务 pino + pino-roll

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

  • 是否使用 PM2 / Docker
  • 日志量(MB / 天)
  • 是否需要 JSON / 文本格式

我可以帮你给出最合适的配置方案

0