在 Node.js 服务运行于 Linux 时,日志轮转(log rotation)通常不靠 Node.js 自身实现,而是由 Linux 的日志管理工具完成。最常见的是 logrotate。下面分几种常见场景说明。
which logrotate
# 通常在 /usr/sbin/logrotate
假设日志路径:
/var/log/myapp/app.log
sudo vim /etc/logrotate.d/myapp
内容示例:
/var/log/myapp/app.log {
daily
missingok
rotate 14
compress
delaycompress
notifempty
copytruncate
}
| 参数 | 作用 |
|---|---|
| daily | 每天轮转 |
| rotate 14 | 保留 14 个历史日志 |
| compress | 压缩旧日志 |
| delaycompress | 延迟压缩(避免刚轮转就压) |
| notifempty | 日志为空不轮转 |
| copytruncate | 复制后清空原文件(Node.js 不停服关键 |
✅ Node.js 必用
copytruncate
否则 Node.js 仍持有旧文件句柄,日志不会写入新文件
如果你用 PM2 启动 Node.js:
~/.pm2/logs/app-out.log
~/.pm2/logs/app-error.log
/home/*/.pm2/logs/*.log {
daily
rotate 7
compress
delaycompress
notifempty
copytruncate
}
或针对单个应用:
/root/.pm2/logs/myapp-*.log {
daily
rotate 7
compress
copytruncate
}
如果你不想用 logrotate:
winstonwinston-daily-rotate-filepinorotating-file-stream示例(winston):
const { createLogger, transports } = require('winston');
const DailyRotateFile = require('winston-daily-rotate-file');
createLogger({
transports: [
new DailyRotateFile({
filename: 'logs/app-%DATE%.log',
datePattern: 'YYYY-MM-DD',
maxFiles: '14d'
})
]
});
⚠️ 缺点:
若用 systemd:
[Service]
StandardOutput=append:/var/log/myapp/app.log
StandardError=append:/var/log/myapp/error.log
再配合 logrotate 即可。
sudo logrotate -d /etc/logrotate.d/myapp # 模拟
sudo logrotate -f /etc/logrotate.d/myapp # 强制执行
✅ 最佳实践
logrotate + copytruncate如果你愿意,可以告诉我:
我可以帮你写一份可直接用的配置。