温馨提示×

nodejs linux日志如何轮转

小樊
46
2026-09-17 18:16:03
栏目: 编程语言

在 Linux 下对 Node.js 日志进行轮转(log rotation),常见做法有几种,从「不依赖代码」到「在 Node 代码内控制」都有。下面按推荐程度使用场景说明。


一、最推荐:使用 Linux 自带的 logrotate(生产环境首选)

优点

  • 不需要改 Node.js 代码
  • 稳定、成熟、系统级统一管理
  • 支持按大小 / 时间轮转、压缩、保留天数

1. 假设 Node.js 日志文件

/var/log/myapp/app.log

2. 创建 logrotate 配置

sudo vim /etc/logrotate.d/myapp

内容示例:

/var/log/myapp/*.log {
    daily
    rotate 7
    compress
    delaycompress
    missingok
    notifempty
    copytruncate
}

3. 关键参数说明

参数 说明
daily 每天轮转(也可 size 100M
rotate 7 保留 7 份
compress 压缩旧日志
copytruncate 重要:复制后清空原文件,不影响 Node 文件句柄
notifempty 空日志不轮转

Node.js 如果使用 fs.appendFile / console.log 重定向到文件,copytruncate 是必须的

4. 手动测试

sudo logrotate -f /etc/logrotate.d/myapp

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

PM2 自带日志轮转插件:

pm2 install pm2-logrotate

常用配置:

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

日志位置:

~/.pm2/logs/

✅ 适合 PM2 管理的服务


三、Node.js 代码内轮转(不依赖系统)

适合:

  • 容器环境
  • 无法使用 logrotate
  • 需要精细控制

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',
  zippedArchive: true
});

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

logger.info('hello');

✅ 自动按天 / 大小切分并压缩


四、Docker 环境怎么做?

方案 1:Docker logging driver

--log-driver json-file
--log-opt max-size=100m
--log-opt max-file=5

方案 2:容器里跑 logrotate(不推荐)


五、常见坑总结

❌ 直接用 mv 重命名日志 → Node 仍在写旧文件
✅ 用 copytruncate 或进程内轮转

❌ 日志无限增长导致磁盘爆
✅ 设置 maxFiles / rotate


六、选择建议

场景 推荐方案
服务器部署 logrotate
PM2 pm2-logrotate
容器 Docker log driver
自定义需求 winston

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

  • 是否用 PM2 / Docker
  • 日志是 console.log 还是写文件
  • Linux 发行版

我可以给你完全可复制的配置

0