在 Linux 下,Node.js 日志分割通常不直接由 Node.js 自身完成,而是借助日志库 + 外部工具来实现。下面按常见方案从简单到专业给你系统讲一下。
适合小项目或临时使用。
const winston = require('winston');
const { createLogger, transports, format } = winston;
const DailyRotateFile = require('winston-daily-rotate-file');
const logger = createLogger({
format: format.combine(
format.timestamp(),
format.json()
),
transports: [
new DailyRotateFile({
dirname: '/var/log/node',
filename: 'app-%DATE%.log',
datePattern: 'YYYY-MM-DD',
maxSize: '20m',
maxFiles: '14d'
})
]
});
✅ 优点:简单
❌ 缺点:进程重启、崩溃可能丢日志
Node.js → stdout/stderr → 日志工具 → 分割文件
console.log('info message');
console.error('error message');
pm2 + pm2-logrotate(最常用)npm install pm2 -g
pm2 install pm2-logrotate
pm2 set pm2-logrotate:max_size 10M
pm2 set pm2-logrotate:retain 30
pm2 set pm2-logrotate:rotateInterval '0 0 * * *'
✅ 自动按大小 / 时间分割
✅ 支持压缩、保留天数
✅ 几乎零代码改动
logrotate(系统级,最稳定)node app.js >> /var/log/node/app.log 2>&1
/etc/logrotate.d/node/var/log/node/*.log {
daily
missingok
rotate 14
compress
delaycompress
notifempty
copytruncate
}
✅ 系统级方案
✅ 不依赖 Node
⚠️ 必须 copytruncate(Node 不重开文件)
适合服务器集群、容器环境。
[Service]
StandardOutput=journal
StandardError=journal
查看:
journalctl -u node-app
| 方案 | 适合场景 | 稳定性 | 复杂度 |
|---|---|---|---|
| winston 分割 | 小项目 | 中 | 低 |
| pm2-logrotate | 单机服务 | 高 | 低 |
| logrotate | 生产服务器 | 高 | 中 |
| systemd/journald | 容器/云 | 高 | 中 |
✅ 生产环境推荐
✅ 不要
fs.appendFile 长期写日志如果你愿意,可以告诉我:
我可以给你一套可直接用的配置。