温馨提示×

为何linux js日志丢失

小樊
57
2026-09-02 12:32:06
栏目: 编程语言

Linux 下 JS(Node.js / 前端构建 / 服务端 JS)日志“丢失”通常不是真的没产生,而是被缓冲、重定向、覆盖或被进程管理工具吞掉。下面按最常见原因系统性说明:


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

1️⃣ 标准输出被缓冲(stdout buffering)

现象

  • 本地能打印
  • 服务器上 console.log 没内容
  • 程序崩溃后日志全没了

原因

  • Node.js 在非 TTY(如 nohup / systemd / docker)下:
    • stdout 是块缓冲
    • 程序异常退出时缓冲没 flush

✅ 解决:

node app.js | stdbuf -oL cat

或:

process.stdout.write(...)

2️⃣ 日志重定向错了

常见错误写法

node app.js > log.txt

❌ 只重定向 stdout,stderr 丢了

✅ 正确:

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

3️⃣ nohup / & 导致日志“消失”

nohup node app.js &

默认会写:

nohup.out

但:

  • 路径不对
  • 被覆盖
  • 权限不足

✅ 建议显式指定:

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

二、进程管理工具“吞日志”

4️⃣ systemd(最常见坑)

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

❌ 日志不在文件里,而在:

journalctl -u your-service

✅ 想写文件:

StandardOutput=append:/var/log/app.log
StandardError=append:/var/log/app.err

5️⃣ PM2 日志轮转 / 覆盖

PM2 默认:

~/.pm2/logs/app-out.log

常见问题:

  • 日志被 rotate 清掉
  • 多实例写同一文件
  • 磁盘满

✅ 查看:

pm2 logs
pm2 flush

三、程序自身问题

6️⃣ 未捕获异常直接退出

throw new Error('x')

→ 进程死,缓冲没刷

✅ 必须:

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

7️⃣ 用了异步日志库但没 flush

如:

  • winston
  • pino(异步模式)

✅ 崩溃前:

logger.end()

四、Docker 场景

8️⃣ Docker 不写文件

JS 日志应打到 stdout:

console.log(...)

查看:

docker logs container_id

❌ 写在容器里 /var/log 会丢


五、磁盘 / 权限问题

9️⃣ 磁盘满 or 权限不足

df -h
ls -l logfile

六、快速自查清单 ✅

你可以逐一排查:

  1. 是否用 2>&1
  2. 是否被 systemd / pm2 / docker 接管
  3. 是否异常退出
  4. 是否 stdout 被缓冲
  5. 是否日志文件被覆盖

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

  • 是 Node.js 还是 浏览器 JS
  • 启动方式(systemd / pm2 / docker / nohup)
  • 日志怎么写的(console / winston / pino)

我可以直接帮你定位到具体哪一行配置有问题。

0 踩