温馨提示×

linux下js日志为何丢失

小樊
48
2026-10-14 09:18:09
栏目: 编程语言

在 Linux 下 JS(Node.js / 前端 / Electron 等)日志“丢失”,通常不是真的没产生,而是没写进去、被覆盖、被缓冲、被重定向错了位置或权限不足。下面按常见原因系统说明。


一、最常见原因

1️⃣ 标准输出 / 标准错误被重定向或吞掉

很多 JS 程序用:

console.log(...)
console.error(...)

但 Linux 下:

node app.js > /dev/null 2>&1

或

nohup node app.js &

日志会:

  • 进文件
  • 进 nohup.out
  • 或直接丢弃

✅ 检查:

ps aux | grep node
lsof -p <pid>

2️⃣ 日志被缓冲(Buffer),进程崩了没 flush

Node.js 的 console.log 在:

  • 非 TTY(管道 / 文件)
  • 高并发

会异步缓冲,进程异常退出时:

缓冲区没写盘 → 日志“丢失”

✅ 解决:

  • 使用日志库(推荐)
  • 或强制 flush
process.stdout.write(log + "\n")

3️⃣ 日志文件被 rotate(日志切割)后写错地方

常见组合:

  • logrotate
  • PM2
  • Docker

现象:

  • 文件存在
  • 但新日志不进去
  • 或写到了已删除的 inode

✅ 检查:

ls -l /proc/<pid>/fd

✅ 正确方式:

  • 使用 winston / pino
  • 支持 reload / SIGHUP

4️⃣ 权限问题(最容易被忽略)

JS 进程用户无写权限:

EACCES: permission denied

但:

  • 错误被 catch 吞了
  • 或只在 stderr

✅ 检查:

ls -l 日志目录
whoami

5️⃣ Docker / 容器环境

Docker 默认:

  • stdout / stderr → json-file
  • 不在容器里写文件

如果你:

fs.writeFileSync('/var/log/app.log')

但:

  • 容器无挂载
  • 容器被删

日志直接消失

✅ 正确方式:

docker logs <container>

或挂载 volume


6️⃣ PM2 日志配置问题

PM2 默认日志在:

~/.pm2/logs

但:

  • 自定义路径错误
  • 或 merge_logs 配置错

✅ 查看:

pm2 logs
pm2 describe <id>

7️⃣ 未捕获异常 / Promise reject

process.on('uncaughtException')
process.on('unhandledRejection')

没监听 → 进程直接死 → 最后日志没写

✅ 必须加:

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

二、推荐正确做法(避免日志丢失)

✅ 使用专业日志库

npm i winston
const winston = require('winston');
winston.add(new winston.transports.File({ filename: 'app.log' }));

优点:

  • 自动 flush
  • 支持 rotate
  • 支持级别

三、快速自查清单

  • [ ] 日志是 stdout 还是文件?
  • [ ] 是否被 > /dev/null?
  • [ ] 进程是否异常退出?
  • [ ] 是否 Docker / PM2?
  • [ ] 是否有写权限?
  • [ ] 是否用了日志库?

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

  • Node 还是浏览器?
  • 怎么运行的(docker / pm2 / systemd)?
  • 用的什么日志方式?

我可以精准定位你这个“丢失”是哪一类。

0 踩