温馨提示×

nodejs linux日志如何分割

小樊
39
2026-09-29 17:37: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 logger = winston.createLogger({
  transports: [
    new DailyRotateFile({
      filename: 'logs/app-%DATE%.log',
      datePattern: 'YYYY-MM-DD',
      maxFiles: '14d',     // 保留14天
      maxSize: '20m'       // 单文件最大20MB
    })
  ]
});

logger.info('hello');

✅ 优点

  • 自动按天 / 大小分割
  • 自动清理旧日志
  • 不需要 Linux 配置

2️⃣ 使用 pino + pino-roll

Node.js 高性能日志方案

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

✅ 适合高并发服务


二、Linux 系统级方案:logrotate(服务器级)

适合 所有日志文件(包括 console.log 重定向)

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

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

说明:

  • daily:每天分割
  • rotate 14:保留 14 份
  • compress:压缩旧日志
  • copytruncate:不重启 Node 进程

⚠️ 注意

  • Node 直接写文件时推荐 copytruncate
  • PM2 / Docker 场景需配合信号或重启

三、PM2 用户(最常见)

方案 1:PM2 + logrotate

pm2 install pm2-logrotate
pm2 set pm2-logrotate:max_size 10M
pm2 set pm2-logrotate:retain 14
pm2 set pm2-logrotate:rotateInterval '0 0 * * *'

✅ 不需要改代码
✅ 适合生产环境


四、Docker 场景

docker log rotate

{
  "log-driver": "json-file",
  "log-opts": {
    "max-size": "10m",
    "max-file": "5"
  }
}

五、方案对比总结

方案 是否需要改代码 推荐场景
winston / pino ✅ 新项目
PM2 logrotate ❌ PM2 部署
Linux logrotate ❌ 服务器统一日志
Docker log ❌ 容器环境

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

  • ✅ 是否用 PM2 / Docker
  • ✅ 是否已有日志代码
  • ✅ 日志量(MB/天)

我可以直接给你一份可复制的配置。

0 踩