在 Linux 下切割 Node.js 日志,常见做法有 4 种,从简单到生产级依次如下。你可以根据项目规模选择。
logrotate(✅ 强烈推荐)适合大多数场景,不需要改 Node.js 代码。
/var/log/node/app.log
sudo vim /etc/logrotate.d/node-app
示例配置:
/var/log/node/*.log {
daily
rotate 7
compress
missingok
notifempty
copytruncate
}
| 参数 | 作用 |
|---|---|
| daily | 每天切割 |
| rotate 7 | 保留 7 份 |
| compress | 压缩旧日志 |
| missingok | 日志不存在不报错 |
| notifempty | 空日志不切割 |
| copytruncate | 复制后清空原文件(Node 不重启) |
✅ 优点
⚠️ 注意:
copytruncate 在极高频日志下可能有极少量丢失,但一般可接受。
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: '7d'
});
const logger = winston.createLogger({
transports: [transport]
});
logger.info('hello node');
✅ 优点
❌ 缺点
pm2 install pm2-logrotate
pm2 set pm2-logrotate:max_size 10M
pm2 set pm2-logrotate:retain 7
pm2 set pm2-logrotate:compress true
✅ 优点
❌ 缺点
mv app.log app.log.2026-01-21
kill -USR1 $(pgrep node)
⚠️ 需要 Node 支持重新打开文件描述符(不是所有情况都安全)
| 场景 | 推荐 |
|---|---|
| 生产环境 | ✅ logrotate |
| PM2 部署 | ✅ pm2-logrotate |
| 自定义日志格式 | winston / pino |
| 临时测试 | 手动 |
❗ 不要直接 rm 正在写入的日志
❗ 不要只用 mv 不通知进程
❗ Docker 中建议挂载 volume + logrotate
如果你愿意,可以告诉我:
我可以帮你写一份 完全可用的 logrotate 配置。