在 Debian 上“分割 Node.js 日志”通常有两种理解:
logrotate 管理日志文件winston、pino 等)下面分别说明。
例如:
/var/log/myapp/app.log
新建文件:
sudo nano /etc/logrotate.d/myapp
内容示例:
/var/log/myapp/*.log {
daily
missingok
rotate 14
compress
delaycompress
notifempty
copytruncate
}
说明:
daily:每天分割rotate 14:保留 14 天compress:压缩旧日志copytruncate:不重启 Node.js 直接截断日志(最重要)⚠️ 如果不用
copytruncate,Node.js 可能仍写旧文件
sudo logrotate -d /etc/logrotate.d/myapp # 测试
sudo logrotate -f /etc/logrotate.d/myapp # 强制执行
const winston = require('winston');
const logger = winston.createLogger({
transports: [
new winston.transports.File({
filename: '/var/log/myapp/error.log',
level: 'error'
}),
new winston.transports.File({
filename: '/var/log/myapp/combined.log'
})
]
});
const pino = require('pino');
const pinoms = require('pino-multi-stream');
const streams = [
{ level: 'error', stream: fs.createWriteStream('/var/log/myapp/error.log') },
{ level: 'info', stream: fs.createWriteStream('/var/log/myapp/info.log') }
];
const logger = pino(pinoms.multistream(streams));
应用内拆分 + logrotate 是最佳实践
PM2 自带日志管理:
pm2 install pm2-logrotate
配置:
pm2 set pm2-logrotate:max_size 10M
pm2 set pm2-logrotate:retain 30
日志位置:
~/.pm2/logs/
❌ Node.js 用 fs.appendFile 但不支持日志轮转
✅ 一定要配合 logrotate + copytruncate
❌ Docker 容器内直接写文件
✅ 挂载 volume 或用 Docker log driver
如果你能告诉我:
我可以给你精确配置。