温馨提示×

linux nodejs日志切割方法

小樊
38
2026-09-23 20:41:05
栏目: 编程语言

在 Linux 下对 Node.js 日志进行切割,常见做法有 应用层切割、系统工具切割(logrotate)、进程管理工具切割(PM2) 等。下面按使用频率和推荐程度说明。


一、使用 logrotate(最推荐,通用方案)

适合: 所有 Node.js 服务(无论用什么启动)

1. 安装 logrotate(一般系统自带)

which logrotate

2. 配置日志切割

假设日志路径:

/var/log/node/app.log

新建配置文件:

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

示例配置:

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

3. 参数说明

  • daily:每天切割
  • rotate 14:保留 14 天
  • compress:压缩旧日志
  • copytruncate:不重启 Node.js 直接截断日志(重要)

4. 手动测试

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

✅ 优点

  • 不需要改 Node.js 代码
  • 稳定、系统级方案

二、使用 PM2(如果你用 PM2 启动 Node)

PM2 自带日志管理。

1. 安装 pm2-logrotate

pm2 install pm2-logrotate

2. 配置

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

3. 日志位置

~/.pm2/logs/

✅ 优点

  • 零额外配置
  • 自动按大小切割

三、Node.js 应用层日志切割(代码级)

适合需要精确控制或使用自定义 logger。

使用 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',
  maxFiles: '14d',
  zippedArchive: true
});

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

✅ 优点

  • 不依赖系统
  • 可按天/大小灵活控制

四、使用 forever(较少用)

forever -o out.log -e err.log app.js

配合 logrotate 使用。


五、方案对比建议

场景 推荐方案
生产服务器 ✅ logrotate
PM2 启动 ✅ pm2-logrotate
微服务/容器 winston 切割
Docker 挂载卷 + logrotate

六、常见坑

❌ Node.js 写文件后日志不更新
✅ 使用 copytruncate

❌ 日志无限增长
✅ 设置 maxFiles / rotate

❌ Docker 内日志爆炸
✅ 限制 stdout + 外部 logrotate


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

  • 是否使用 PM2 / Docker
  • 日志路径
  • 按天还是按大小切

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

0 踩