在 Debian 上,Node.js 自身不会自动分割日志,通常需要借助外部工具来实现日志轮转(log rotation)。下面按常见方案从简单到专业给你介绍几种做法。
logrotate(标准做法)Debian 自带 logrotate,非常适合管理 Node.js 日志。
/var/log/myapp/app.log
sudo nano /etc/logrotate.d/myapp
示例配置:
/var/log/myapp/*.log {
daily
missingok
rotate 14
compress
delaycompress
notifempty
copytruncate
}
daily:每天切割rotate 14:保留 14 天compress:压缩旧日志copytruncate:不重启 Node.js 也能切割(关键)notifempty:空文件不切sudo logrotate -d /etc/logrotate.d/myapp # 模拟
sudo logrotate -f /etc/logrotate.d/myapp # 强制执行
✅ 适合:
fs.writeFile / console.log / winston 直接写文件npm install winston winston-daily-rotate-file
示例:
const winston = require('winston');
const DailyRotateFile = require('winston-daily-rotate-file');
const transport = new DailyRotateFile({
dirname: '/var/log/myapp',
filename: 'app-%DATE%.log',
datePattern: 'YYYY-MM-DD',
maxFiles: '14d',
zippedArchive: true
});
const logger = winston.createLogger({
transports: [transport]
});
logger.info('hello');
✅ 优点:
如果你用 PM2 启动 Node.js,它自带日志管理。
~/.pm2/logs/
pm2 install pm2-logrotate
配置示例:
pm2 set pm2-logrotate:max_size 10M
pm2 set pm2-logrotate:retain 30
pm2 set pm2-logrotate:compress true
✅ 优点:
logrotate 也支持:
size 50M
示例:
/var/log/myapp/app.log {
size 50M
rotate 10
compress
copytruncate
}
| 场景 | 推荐方案 |
|---|---|
| 直接写文件 | logrotate |
| 用 winston/pino | daily-rotate-file |
| 用 PM2 | pm2-logrotate |
| 容器/Docker | 挂载 + logrotate 或 sidecar |
❌ Node.js 写日志后 文件被 rename 但 fd 不变
✅ 一定要用 copytruncate
❌ Docker 容器里直接 logrotate
✅ 在宿主机做,或用 docker logs
如果你愿意,可以告诉我:
我可以给你完全匹配你环境的配置。