温馨提示×

linux中nodejs日志如何切割

小樊
42
2026-09-11 11:47:53
栏目: 编程语言

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

const logger = winston.createLogger({
  transports: [transport]
});

logger.info('hello');

✅ 优点

  • 无需额外进程
  • 支持按天 / 大小切割
  • 自动清理

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
  })
);

✅ 高性能,适合高并发服务


二、使用 logrotate(系统级,最稳定)

如果 Node.js 直接输出到 stdout 或文件(如 node app.js > app.log):

1️⃣ 编写 logrotate 配置

sudo vim /etc/logrotate.d/node-app
/var/www/node-app/logs/app.log {
  daily
  rotate 14
  compress
  missingok
  notifempty
  copytruncate
}

2️⃣ 关键参数说明

参数 作用
daily 每天切割
rotate 保留数量
compress 压缩
copytruncate 不重启 Node 直接截断

✅ 适合 PM2 / 原生 node


三、PM2 自带日志管理

如果你用 PM2:

pm2 install pm2-logrotate

配置:

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

✅ 最简单,无需改代码


四、按大小实时切割(手动方案)

logrotate -f /etc/logrotate.d/node-app

或结合 crontab

0 0 * * * /usr/sbin/logrotate /etc/logrotate.d/node-app

五、方案选择建议

场景 推荐
新项目 winston / pino
已有 stdout logrotate
PM2 部署 pm2-logrotate
高并发 pino

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

  • Node 版本
  • 是否用 PM2
  • 日志是 stdout 还是文件

我可以给你一套 可直接用的配置

0