温馨提示×

为什么linux js日志丢失

小樊
48
2026-09-14 16:40:34
栏目: 编程语言

Linux 上 JS(Node.js / 前端构建 / 容器里的 JS 服务)日志“丢失”,通常不是真的被删了,而是输出位置、缓冲、重定向或权限导致你“看不到”。下面按最常见原因逐条说明。


一、最常见原因(90% 情况)

1️⃣ 日志写到了 stdout / stderr,但你没收集

很多 JS 程序(尤其是 Node / Docker):

  • 日志只输出到 console.log
  • 你却去查 xxx.log 文件 → 当然没有

✅ 正确做法:

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

或 Docker:

docker logs 容器名

2️⃣ stdout 被缓冲(最隐蔽)

Node.js 在非 TTY 环境(cron / systemd / docker)中:

  • console.log 是 块缓冲
  • 程序崩溃 / 被 kill → 缓冲没刷出来

✅ 解决:

node --no-deprecation --stack-trace-limit=50 app.js

或强制不缓冲:

stdbuf -oL -eL node app.js

3️⃣ 程序异常退出(日志还没写)

比如:

  • process.exit()
  • OOM 被 kill
  • Docker restart

✅ 检查:

dmesg | grep -i kill
journalctl -u your-service

二、文件相关原因

4️⃣ 日志文件路径不存在 / 权限不足

JS 写日志时:

  • 目录不存在
  • 没有写权限

✅ 检查:

ls -l /var/log/your-app
whoami

5️⃣ 日志被 log rotate 切走

Linux 默认:

  • /var/log/*.log 会被 rotate
  • 老日志变成 xxx.log.1.gz

✅ 查历史:

ls /var/log | grep your-app
zcat /var/log/your-app.log.1.gz

三、Docker / 容器常见坑

6️⃣ Docker 日志驱动限制

Docker 默认 json-file,但:

  • 日志大小限制
  • 被自动清理

✅ 查看:

docker inspect 容器 | grep LogConfig

7️⃣ 容器重启,日志没了

如果没挂载 volume:

docker run -v /host/log:/app/log ...

四、Node.js 特有原因

8️⃣ 用了 winston / pino,但配置错

例如:

  • 写到文件,但路径错
  • transport 没生效

✅ 自查:

logger.info('test') // 立刻看文件

9️⃣ 多进程 / cluster 日志竞争

  • master / worker 写同一文件
  • 部分日志被覆盖

✅ 建议:

  • 用 stdout
  • 或用集中日志(ELK / Loki)

五、快速定位 checklist ✅

你可以按顺序查:

  1. docker logs / journalctl
  2. 是否用了 console.log
  3. 是否被缓冲(stdbuf)
  4. 日志文件路径 & 权限
  5. 是否被 rotate
  6. 程序是否崩溃

如果你愿意,可以告诉我:

  • Node / 浏览器 / Docker?
  • 日志怎么打的(console.log / winston / pino)
  • Linux 发行版 & 运行方式(systemd / cron / k8s)

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

0 踩