在 Linux 下切割 Node.js 日志,常见做法有 3 种:
✅ logrotate(最推荐)
✅ PM2 自带日志切割
✅ Node.js 代码内按天切割
下面按使用场景详细说明。
这是 最标准、最稳定 的方式,适合所有 Node.js 服务。
/var/log/myapp/
├── app.log
├── error.log
sudo vim /etc/logrotate.d/nodeapp
/var/log/myapp/*.log {
daily
rotate 30
compress
delaycompress
missingok
notifempty
create 0644 node node
copytruncate
}
| 参数 | 作用 |
|---|---|
| daily | 每天切割 |
| rotate 30 | 保留 30 天 |
| compress | 压缩旧日志 |
| copytruncate | 不重启 Node.js 也能切割 |
| missingok | 日志不存在也不报错 |
sudo logrotate -vf /etc/logrotate.d/nodeapp
✅ 优点
如果你用 PM2 管理 Node.js,这是最简单的方式。
pm2 install pm2-logrotate
pm2 set pm2-logrotate:max_size 10M
pm2 set pm2-logrotate:retain 30
pm2 set pm2-logrotate:compress true
pm2 set pm2-logrotate:dateFormat YYYY-MM-DD
~/.pm2/logs/
├── app-out-2026-01-21.log
├── app-out-2026-01-20.log.gz
✅ 优点
⚠️ 缺点
适合 小工具 / 临时脚本。
const winston = require('winston');
const path = require('path');
const logger = winston.createLogger({
transports: [
new winston.transports.File({
filename: path.join(
__dirname,
`logs/app-${new Date().toISOString().slice(0, 10)}.log`
)
})
]
});
❌ 缺点:
如果是 Docker + Node.js:
✅ 推荐
docker logs container_name > /var/log/node.log
或直接:
json-file + logrotate
| 场景 | 推荐方案 |
|---|---|
| 生产环境 | ✅ logrotate |
| PM2 管理 | ✅ pm2-logrotate |
| 小脚本 | 代码切割 |
| Docker | stdout + logrotate |
如果你愿意,可以告诉我:
我可以帮你 直接生成一份可用的 logrotate 配置。