温馨提示×

debian js日志为啥丢失

小樊
39
2026-09-01 05:54:13
栏目: 编程语言

在 Debian 上“JS 日志丢失”通常不是 JS 本身的问题,而是运行环境 / 日志采集方式 / 权限 / 服务管理导致的。下面按常见原因逐条说明,并给排查办法。


一、最常见原因分类

1️⃣ 用 systemd 管理 Node 服务,但日志没进 journal

如果你是:

systemctl start mynode.service

但 JS 里只是:

console.log('xxx')

默认情况下日志在 journal 里,不在文件里,很多人以为“丢了”。

✅ 查看方式:

journalctl -u mynode.service -f

✅ 想写文件:

const fs = require('fs');
fs.appendFileSync('/var/log/myapp.log', 'xxx\n');

2️⃣ 标准输出被重定向 / 覆盖

常见错误写法:

node app.js > log.txt
node app.js > log.txt  # 再次启动,覆盖

✅ 正确追加:

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

3️⃣ pm2 日志被清理或路径不对

如果你用 pm2:

pm2 logs

日志默认在:

~/.pm2/logs/

常见问题:

  • 服务器重启后 pm2 没自动启动
  • 日志被 logrotate 清掉
  • 磁盘满了

✅ 检查:

df -h
pm2 status

4️⃣ 程序崩溃,日志还没 flush

Node 是异步的,console.log 不一定立即写盘。

如果:

  • 进程被 kill
  • OOM
  • Docker / 容器退出

日志可能没来得及写。

✅ 解决:

process.on('uncaughtException', e => {
  fs.appendFileSync('/var/log/err.log', e.stack);
  process.exit(1);
});

5️⃣ 权限问题(/var/log 写不了)

Debian 默认:

/var/log 只有 root 可写

普通用户运行 node:

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

静默失败或抛错被吞

✅ 解决:

  • /home/user/logs/
  • sudo chown

6️⃣ Docker / 容器环境

在容器里:

  • 日志必须打到 stdout/stderr
  • 写文件会随容器销毁丢失

✅ 正确姿势:

console.log('info')
console.error('err')

查看:

docker logs <container>

7️⃣ 日志被 logrotate 删了

Debian 默认有:

/etc/logrotate.d/

可能:

  • 日志被压缩
  • 被保留 0 份
  • 被 cron 清掉

✅ 检查:

ls /var/log/
cat /etc/logrotate.d/*

二、快速自查清单 ✅

# 1. 看进程是否还活着
ps aux | grep node

# 2. 看 systemd 日志
journalctl -u 你的服务 -n 100

# 3. 看磁盘
df -h

# 4. 看权限
ls -l /var/log/

# 5. 看是否 pm2
pm2 logs

三、推荐稳妥方案(生产级)

  • winston / pino
  • 日志写文件 + systemd journal
  • 配 logrotate
  • 容器环境只打 stdout

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

  • Debian 版本
  • Node 怎么启动(systemd / pm2 / docker / 直接跑)
  • 日志是 console 还是写文件

我可以直接帮你定位“是哪一步丢的”。

0