在 Debian 上,Node.js 应用本身的日志通常不会自动分割,需要借助外部工具或代码逻辑来实现。常见做法有以下几种,按推荐程度从易到难说明:
适合:所有 Node.js 服务(PM2、systemd、裸跑都行)
/var/log/nodeapp/)创建配置文件:
sudo nano /etc/logrotate.d/nodeapp
内容示例:
/var/log/nodeapp/*.log {
daily
missingok
rotate 14
compress
delaycompress
notifempty
copytruncate
}
说明:
daily:每天切割rotate 14:保留 14 天compress:压缩旧日志copytruncate:不重启 Node.js 也能切割(非常重要)sudo logrotate -d /etc/logrotate.d/nodeapp
sudo logrotate -f /etc/logrotate.d/nodeapp
✅ 优点:简单、稳定、不影响进程
❌ 缺点:粒度只能到天
pm2 install pm2-logrotate
pm2 set pm2-logrotate:max_size 10M
pm2 set pm2-logrotate:retain 7
pm2 set pm2-logrotate:compress true
pm2 set pm2-logrotate:dateFormat YYYY-MM-DD_HH-mm-ss
✅ 自动按大小分割
❌ 仅限 PM2 管理的进程
如使用 winston + winston-daily-rotate-file:
const { createLogger, transports } = require('winston');
const DailyRotateFile = require('winston-daily-rotate-file');
const logger = createLogger({
transports: [
new DailyRotateFile({
filename: '/var/log/nodeapp/app-%DATE%.log',
datePattern: 'YYYY-MM-DD',
maxFiles: '14d'
})
]
});
✅ 灵活
❌ 增加代码复杂度
如果你用 systemd 启动 Node.js:
[Service]
StandardOutput=journal
StandardError=journal
日志查看:
journalctl -u nodeapp
可配置:
sudo nano /etc/systemd/journald.conf
SystemMaxUse=500M
MaxRetentionSec=2week
✅ 系统级
❌ 不生成普通 .log 文件
| 场景 | 推荐方式 |
|---|---|
| 生产服务 | logrotate |
| 用 PM2 | pm2-logrotate |
| 微服务/容器 | 直接输出 stdout + 外部采集 |
| 需要按小时 | logrotate + cron 或代码 |
如果你愿意,可以告诉我:
我可以给你一份可直接用的配置。