温馨提示×

debian nodejs日志丢失原因

小樊
43
2026-09-07 07:20:32
栏目: 编程语言

在 Debian 系统上,Node.js 日志“丢失”通常不是 Node 本身把日志删了,而是运行方式、系统日志机制或文件轮转导致的。下面按常见原因分类说明。


一、最常见原因

1. Node.js 以 systemd 方式运行(日志不在文件里)

如果你用:

systemctl start mynode

Node 的 console.log 默认会进入 journald,而不是文件。

✅ 查看方式:

journalctl -u mynode.service
journalctl -u mynode.service --since "1 hour ago"

❌ 误区:

“我没看到日志文件,所以日志丢了”

实际是:

日志在 systemd 里,没落盘


2. 日志被 logrotate 截断或删除

Debian 默认有 logrotate,如果:

  • 配置了 daily
  • 没用 copytruncate
  • Node 仍持有旧文件句柄

结果:

  • 文件被改名(app.log.1
  • Node 还在写旧 inode
  • app.log 是空的

✅ 检查:

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

✅ 正确做法:

/var/log/app.log {
    daily
    rotate 7
    copytruncate
    missingok
    notifempty
}

3. 程序以 &nohup 后台运行,但终端关闭

例如:

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

终端退出后:

  • 某些 shell 会发 SIGHUP
  • Node 被 kill
  • 日志只写到一半

✅ 推荐:

  • systemd
  • pm2 / forever

4. 磁盘写满(最常见“假丢失”)

df -h

如果 /var/ 满了:

  • Node 写日志失败
  • 不报错或只报 ENOENT / ENOSPC

✅ 检查:

df -h
dmesg | grep error

5. 日志路径是相对路径,工作目录变了

例如:

fs.createWriteStream('logs/app.log')

但:

  • systemd 的工作目录不是项目目录
  • crontab 启动 Node

结果:

  • 日志写到了你找不到的地方

✅ 建议:

path.join(__dirname, 'logs/app.log')

二、Node.js 自身相关原因

6. 只用了 console.log,没落盘

console.log('error')

如果:

  • 没重定向
  • 没日志库

→ 日志只存在于 stdout

✅ 推荐:

  • winston
  • pino
  • bunyan

7. 未捕获异常导致进程退出

process.on('uncaughtException', ...)

如果没处理:

  • Node 直接退出
  • 最后日志没写

✅ 至少:

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

三、容器 / 虚拟化场景(如果你在用)

8. Docker + Debian

  • Node 日志在容器里
  • 容器被删 → 日志没了

✅ 正确:

docker logs <container>

或挂载 volume


四、快速排查清单(直接照做)

# 1. 系统日志
journalctl -u your-node.service

# 2. 磁盘
df -h

# 3. 日志轮转
ls -l /var/log
cat /etc/logrotate.d/*

# 4. 进程
ps aux | grep node

# 5. Node 工作目录
pwdx <pid>

五、总结一句话

Debian 上 Node 日志“丢失”,90% 是因为:日志在 journald、被 logrotate 截断、或进程已退出。

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

  • Node 怎么启动的(systemd / pm2 / 手动)
  • 日志怎么写的(console / fs / winston)
  • 日志“丢失”的具体表现

我可以直接帮你定位到具体原因 + 修复方案

0