温馨提示×

Ubuntu Nodejs日志为何丢失

小樊
43
2026-08-05 10:17:54
栏目: 编程语言

Ubuntu + Node.js 环境中,日志“丢失”通常不是真的消失了,而是被系统、进程管理工具或 Node.js 自身行为“吞掉/重定向/截断”了。下面按最常见原因 → 排查方式 → 解决办法系统说明。


一、最常见原因汇总(重点看前 5 个)

1️⃣ systemd 把日志重定向了(最常见)

如果你用 systemctl 启动 Node.js:

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

stdout / stderr 默认由 systemd 接管 ❌ 你在代码里 console.log() 不会写到文件

查看方式:

journalctl -u your-service-name -f

解决方式:

StandardOutput=append:/var/log/node/app.log
StandardError=append:/var/log/node/app-error.log

或:

StandardOutput=journal+console

2️⃣ PM2 的日志被轮转或路径不对

PM2 日志默认在:

~/.pm2/logs/

常见问题:

  • 磁盘满了
  • 日志被 pm2 flush 清空
  • 日志被 logrotate 删除

排查:

pm2 logs
pm2 list

解决:

pm2 flush        # 清空(确认是否误删)
pm2 restart all

✅ 建议配置:

pm2 start app.js --log /var/log/node/app.log

3️⃣ Node.js 输出被缓冲(stdout 延迟)

Node.js 在非 TTY 环境(服务器)中:

  • console.log块缓冲
  • 程序崩溃时 缓冲区未刷新

✅ 表现:

  • 程序异常退出
  • 最后几行日志消失

解决:

process.stdout._handle?.setBlocking(true)

或使用:

console.error()   // stderr 默认不缓冲

4️⃣ 程序异常退出(没捕获错误)

未捕获异常会导致:

  • 日志还没写
  • 进程直接退出

常见原因:

throw new Error('db fail')

解决:

process.on('uncaughtException', (err) => {
  console.error('UNCAUGHT:', err)
})

process.on('unhandledRejection', (err) => {
  console.error('REJECTION:', err)
})

5️⃣ 日志文件被覆盖 / 重定向错误

常见错误写法:

node app.js > app.log

再次启动时:

node app.js > app.log  # 会清空

✅ 正确:

node app.js >> app.log

二、Ubuntu 系统级原因

6️⃣ logrotate 把日志删了

Ubuntu 默认会轮转 /var/log

检查:

cat /etc/logrotate.d/node

可能配置:

rotate 7
missingok

✅ 导致:旧日志被删


7️⃣ 磁盘 / inode 满了

df -h
df -i

✅ 表现:

  • 日志写不进去
  • 无报错

8️⃣ Docker / 容器环境

如果你在 Docker 中运行 Node.js:

  • 日志在 容器 stdout
  • 容器删除 = 日志消失

✅ 查看:

docker logs <container>

✅ 解决:

  • 挂载日志卷
  • 使用日志驱动

三、Node.js 日志“看起来丢失”的 3 个误区

现象 真实原因
没看到日志 stdout 被 systemd 接管
日志突然没了 进程崩溃
文件是空的 缓冲未刷新

四、推荐的“不丢日志”方案 ✅

✅ 生产环境最佳实践

pm2 start app.js --name api --log /var/log/node/api.log

或:

const fs = require('fs')
const log = fs.createWriteStream('/var/log/node/app.log', { flags: 'a' })
log.write('hello\n')

或直接使用日志库:

  • winston
  • pino(高性能,推荐)

五、快速自检清单 ✅

你可以按顺序检查:

# 1. systemd
journalctl -u your-service -f

# 2. PM2
pm2 logs

# 3. 磁盘
df -h

# 4. Node 是否崩溃
dmesg | tail

# 5. 是否捕获异常
grep -R "uncaughtException" .

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

  • ✅ 你用 systemd / PM2 / Docker / 直接 node
  • ✅ 日志是 console.log 还是写文件
  • ✅ 是否进程会崩溃

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

0