Node.js 日志“不滚动”(即日志文件一直增大、没有按大小或时间切割/归档)通常是日志库配置或运行环境导致的。下面按常见原因逐一说明,并给出排查和解决思路。
fs.writeFile / fs.appendFile如果你是自己写日志:
fs.appendFile('app.log', logText, () => {})
这种写法永远不会滚动,需要你自己实现切割逻辑。
✅ 解决:
rotating-file-streamDailyRotateFile很多人这样写:
const transport = new winston.transports.File({
filename: 'app.log'
})
⚠️ File transporter 不会滚动
✅ 正确做法:
const transport = new winston.transports.DailyRotateFile({
filename: 'app-%DATE%.log',
datePattern: 'YYYY-MM-DD',
maxSize: '20m',
maxFiles: '14d'
})
PM2 默认会写日志,但:
✅ 解决方式:
方式一:PM2 自带日志切割
pm2 install pm2-logrotate
pm2 set pm2-logrotate:max_size 10M
pm2 set pm2-logrotate:retain 7
方式二:Node 内部用 winston / pino
在 Docker 中:
✅ 解决:
docker logs --tail 100 container
配置 json-file 或 logrotate
排查:
ls -l logs/
df -h
lsof | grep app.log
如果你手动 fs.createWriteStream:
const stream = fs.createWriteStream('app.log')
进程不重启,文件不会变。
| 检查项 | 是否 |
|---|---|
| 是否使用日志库 | ☐ |
| 是否使用 DailyRotateFile | ☐ |
| 是否 PM2 启动 | ☐ |
| 是否 Docker | ☐ |
| 是否写 stdout | ☐ |
✅ Node + PM2 + winston + pm2-logrotate
或
✅ pino + pino-rolling
如果你愿意,可以贴一下:
我可以直接帮你改配置。