在 Ubuntu 上,Node.js 本身不会自动切割日志,通常需要借助外部工具或日志库来实现日志切割(Log Rotation)。下面按常见方案从简单到专业给你介绍。
logrotate(系统级,最常用)which logrotate
/var/log/node/app.log
sudo nano /etc/logrotate.d/node-app
内容示例:
/var/log/node/app.log {
daily
missingok
rotate 14
compress
delaycompress
notifempty
copytruncate
}
daily:每天切割rotate 14:保留 14 天compress:压缩旧日志copytruncate:不重启 Node.js 直接截断日志(很重要)sudo logrotate -d /etc/logrotate.d/node-app
sudo logrotate -f /etc/logrotate.d/node-app
✅ 适合生产环境,不需要改 Node.js 代码
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: '/var/log/node/app-%DATE%.log',
datePattern: 'YYYY-MM-DD',
maxFiles: '14d',
zippedArchive: true
});
const logger = winston.createLogger({
transports: [transport]
});
logger.info('hello');
✅ 自动按天生成日志
✅ 不需要 logrotate
❌ 增加代码复杂度
如果你用 PM2 启动 Node.js:
pm2 install pm2-logrotate
配置:
pm2 set pm2-logrotate:max_size 10M
pm2 set pm2-logrotate:retain 30
✅ 一行命令搞定
✅ 自动压缩、清理
nohup + 手动切割mv app.log app.log.1
kill -USR1 <node_pid>
❌ 容易出错,不适合生产
| 场景 | 推荐方案 |
|---|---|
| 原生 Node 启动 | logrotate |
| PM2 启动 | pm2-logrotate |
| 想要代码级控制 | winston-daily-rotate-file |
如果你愿意,可以告诉我:
我可以给你精确配置。