温馨提示×

linux nodejs日志怎么切割

小樊
35
2026-09-14 16:47:39
栏目: 编程语言

在 Linux 下对 Node.js 日志进行切割,常见做法有下面几种,按「推荐程度 + 复杂度」从低到高说明。


一、最简单:用 logrotate(强烈推荐)

适合场景:Node.js 直接写文件(如 fs.writeFile / winston / pino 文件输出)

1. 示例日志文件

/var/log/node/app.log

2. 创建 logrotate 配置

sudo vim /etc/logrotate.d/node-app

内容示例:

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

3. 参数说明

  • daily:每天切割
  • rotate 14:保留 14 天
  • compress:压缩旧日志
  • copytruncate:不重启 Node.js 也能切割(常用)

4. 手动测试

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

✅ 优点:不侵入代码、稳定
❌ 缺点:不是“按大小实时切”


二、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({
  dirname: '/var/log/node',
  filename: 'app-%DATE%.log',
  datePattern: 'YYYY-MM-DD',
  maxSize: '20m',
  maxFiles: '14d'
});

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

✅ 自动按天 + 大小切割
❌ 日志文件名会变化


三、使用 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

✅ 零代码改动
✅ 适合 pm2 部署


四、使用 pino + pino-roll

npm install pino pino-roll
const pino = require('pino')
const pinoRoll = require('pino-roll')

const logger = pino({
  transport: {
    targets: [{
      target: 'pino-roll',
      options: {
        file: '/var/log/node/app.log',
        frequency: 'daily',
        size: '10m'
      }
    }]
  }
})

✅ 高性能日志库
✅ 原生支持切割


五、不推荐方式(但有人用)

  • 自己写定时器 + fs.rename
  • 用 cron + mv ⚠️ 容易丢日志或文件句柄异常

推荐方案总结

场景 推荐方案
生产环境通用 ✅ logrotate
用 pm2 ✅ pm2-logrotate
想代码控制 winston / pino
高并发 pino

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

  • 你用的 日志库(winston / pino / console)
  • 是否用 pm2 / docker
  • 想按 大小 / 时间 / 天

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

0 踩