在 Linux 下对 Node.js 日志进行轮转(log rotation),常见做法有几种,从「不依赖代码」到「在 Node 代码内控制」都有。下面按推荐程度和使用场景说明。
logrotate(生产环境首选)优点
/var/log/myapp/app.log
sudo vim /etc/logrotate.d/myapp
内容示例:
/var/log/myapp/*.log {
daily
rotate 7
compress
delaycompress
missingok
notifempty
copytruncate
}
| 参数 | 说明 |
|---|---|
daily |
每天轮转(也可 size 100M) |
rotate 7 |
保留 7 份 |
compress |
压缩旧日志 |
copytruncate |
重要:复制后清空原文件,不影响 Node 文件句柄 |
notifempty |
空日志不轮转 |
✅ Node.js 如果使用
fs.appendFile/console.log重定向到文件,copytruncate是必须的
sudo logrotate -f /etc/logrotate.d/myapp
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 管理的服务
适合:
winston + winston-daily-rotate-filenpm 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');
✅ 自动按天 / 大小切分并压缩
--log-driver json-file
--log-opt max-size=100m
--log-opt max-file=5
❌ 直接用 mv 重命名日志 → Node 仍在写旧文件
✅ 用 copytruncate 或进程内轮转
❌ 日志无限增长导致磁盘爆
✅ 设置 maxFiles / rotate
| 场景 | 推荐方案 |
|---|---|
| 服务器部署 | logrotate |
| PM2 | pm2-logrotate |
| 容器 | Docker log driver |
| 自定义需求 | winston |
如果你愿意,可以告诉我:
console.log 还是写文件我可以给你完全可复制的配置。