温馨提示×

nodejs日志不滚动什么原因

小樊
33
2026-09-20 20:55:28
栏目: 编程语言

Node.js 日志“不滚动”(即日志文件一直增大、没有按大小或时间切割/归档)通常是日志库配置或运行环境导致的。下面按常见原因逐一说明,并给出排查和解决思路。


一、常见原因分类

1️⃣ 使用的是普通 fs.writeFile / fs.appendFile

如果你是自己写日志:

fs.appendFile('app.log', logText, () => {})

这种写法永远不会滚动,需要你自己实现切割逻辑。

✅ 解决:

  • 使用日志库(winston / pino / bunyan)
  • 或配合 rotating-file-stream

2️⃣ 用了 winston,但没加 DailyRotateFile

很多人这样写:

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'
})

3️⃣ PM2 启动,但日志没配置

PM2 默认会写日志,但:

  • 默认只按 进程重启 才新建
  • 不会自动按大小切割

✅ 解决方式:

方式一:PM2 自带日志切割

pm2 install pm2-logrotate
pm2 set pm2-logrotate:max_size 10M
pm2 set pm2-logrotate:retain 7

方式二:Node 内部用 winston / pino


4️⃣ Docker / 容器环境

在 Docker 中:

  • 日志写到 stdout
  • 由 Docker log driver 控制
  • Node 内部切不切都没用

✅ 解决:

docker logs --tail 100 container

配置 json-filelogrotate


5️⃣ 文件被占用 / 权限问题

  • 日志目录无写权限
  • 旧日志删不掉
  • inode 被锁

排查:

ls -l logs/
df -h
lsof | grep app.log

6️⃣ 进程没退出 / 流没关闭

如果你手动 fs.createWriteStream

const stream = fs.createWriteStream('app.log')

进程不重启,文件不会变。


二、快速自检清单 ✅

检查项 是否
是否使用日志库
是否使用 DailyRotateFile
是否 PM2 启动
是否 Docker
是否写 stdout

三、推荐组合(最稳)

Node + PM2 + winston + pm2-logrotate

pino + pino-rolling


如果你愿意,可以贴一下:

  • 用的什么日志库
  • 启动方式(node / pm2 / docker)
  • 相关日志代码

我可以直接帮你改配置。

0