在 Ubuntu 上,Node.js 日志分割常见有几种方式,从简单到专业给你一个完整方案。你可以按场景选择。
logrotate(推荐 ✅)适合场景:Node.js 直接用 fs.writeFile / fs.createWriteStream 写日志,或 PM2 日志。
which logrotate
假设你的日志路径是:
/var/log/myapp/app.log
新建配置:
sudo vim /etc/logrotate.d/myapp
内容示例:
/var/log/myapp/*.log {
daily
rotate 7
compress
delaycompress
missingok
notifempty
create 0640 www-data www-data
copytruncate
}
| 参数 | 作用 |
|---|---|
| daily | 每天分割 |
| rotate 7 | 保留 7 份 |
| compress | 压缩旧日志 |
| copytruncate | 不重启 Node.js 也能生效 |
| missingok | 日志不存在不报错 |
sudo logrotate -d /etc/logrotate.d/myapp
✅ 优点:简单、稳定、不依赖 Node 代码
❌ 缺点:copytruncate 有极小概率丢几行日志
适合场景:用 PM2 管理 Node.js
npm install -g pm2
pm2 install pm2-logrotate
pm2 set pm2-logrotate:max_size 10M
pm2 set pm2-logrotate:retain 7
pm2 set pm2-logrotate:compress true
✅ 日志路径一般在:
~/.pm2/logs/
✅ 优点:
❌ 缺点:
适合场景:需要按天、按大小、自动清理
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',
maxSize: '20m',
maxFiles: '14d',
zippedArchive: true
});
const logger = winston.createLogger({
level: 'info',
format: winston.format.json(),
transports: [
transport,
new winston.transports.Console()
]
});
logger.info('hello world');
✅ 优点:
❌ 缺点:
如果你在 Docker 中运行 Node.js:
docker logs
✅ 推荐:
| 场景 | 推荐方案 |
|---|---|
| 生产环境 + PM2 | PM2 logrotate |
| 普通 Node 服务 | logrotate |
| 需要精细控制 | Winston Daily Rotate |
| Docker | stdout + log driver |
如果你愿意,可以告诉我:
我可以帮你直接写一份可用的配置文件。