温馨提示×

为何nodejs linux日志丢失

小樊
46
2026-10-05 12:44:16
栏目: 编程语言

在 Linux 上 Node.js 日志“丢失”通常不是真的没产生,而是被重定向、缓冲、覆盖或进程异常退出导致看不到。下面按最常见原因给你系统梳理。


一、最常见原因(90% 场景)

1️⃣ 日志被重定向到 stdout / stderr,但你没接住

很多 Node 服务这样启动:

node app.js &

或

npm start &

日志其实是:

  • console.log → stdout
  • console.error → stderr

但:

  • 后台运行没重定向
  • SSH 断开后 stdout 就没了
  • systemd / docker 没配置日志收集

✅ 解决:

node app.js > app.log 2>&1 &

或 systemd / pm2 / docker logs


2️⃣ 使用 PM2 但没看 PM2 日志

PM2 默认日志在:

~/.pm2/logs/

你可能只看了 console,但 PM2 已经接管输出。

✅ 查看:

pm2 logs

3️⃣ 进程异常退出(日志还没 flush)

Node 是异步 + 有缓冲的:

  • console.log 不是立即写磁盘
  • 进程被 kill -9 / OOM / 崩溃 → 缓冲丢失

✅ 解决:

  • 用 process.on('exit')
  • 用日志库(winston / pino)
  • 避免 kill -9

二、Linux / 系统层原因

4️⃣ stdout 被 systemd 吞了

如果你用 systemd:

[Service]
ExecStart=/usr/bin/node app.js

日志在:

journalctl -u your-service

✅ 不要自己写文件,先查 journalctl


5️⃣ 文件被 logrotate 截断 / 删了

logrotate 可能:

  • 重命名日志
  • 删除旧日志
  • Node 还持有旧 fd → 写入“幽灵文件”

✅ 现象:

  • 文件大小不变
  • lsof | grep deleted 有 node 进程

✅ 解决:

  • 用 copytruncate
  • 或用 pm2 / winston 自带 rotate

三、Node.js 代码层原因

6️⃣ 用了 console,但生产不该用

console.log:

  • 同步阻塞
  • 不可控
  • 易丢失

✅ 正确方式:

const winston = require('winston')

或

const pino = require('pino')

7️⃣ 未捕获异常导致直接退出

process.on('uncaughtException', e => {
  console.error(e)
})

否则:

  • 没日志
  • 进程直接死

四、Docker 场景(很常见)

8️⃣ 日志写到文件,但容器销毁就没了

Docker 默认只看 stdout/stderr

✅ 正确:

console.log(...) // 不要写本地文件

然后:

docker logs container

五、快速自查清单 ✅

你可以挨个确认:

  • [ ] 日志是 console.log 还是写文件?
  • [ ] 是否后台运行但没重定向?
  • [ ] 是否用 pm2 / systemd / docker?
  • [ ] 进程是否异常退出?
  • [ ] 是否 logrotate 截断?
  • [ ] 是否真的“没写”还是“没看到”?

六、推荐生产方案(避坑)

✅ 最佳实践:

  • Node 只输出 stdout
  • systemd / docker 收集日志
  • 用 pino / winston
  • 不自己管理日志文件

如果你愿意,可以贴:

  • 启动方式(pm2 / systemd / docker)
  • 日志写法(console / fs.write)
  • 丢失的具体场景

我可以直接帮你定位到是哪一条原因。

0 踩