温馨提示×

为什么debian nodejs日志丢失

小樊
46
2026-09-13 05:26:15
栏目: 编程语言

Debian 上 Node.js 日志“丢失”通常不是真的被删除了,而是日志没有写到你以为的地方,或者进程退出/重启导致缓冲丢失。下面按最常见原因给你一个排查清单。


一、最常见原因

1. 用了 console.log,但标准输出没被捕获

很多部署方式是:

  • systemd 服务
  • PM2
  • Docker
  • 后台 nohup node app.js &

如果你只是:

console.log('something')

那日志实际在:

  • stdout / stderr
  • 而不是某个 app.log 文件

✅ 查看方式:

journalctl -u your-node-service

pm2 logs

2. systemd 没配置日志持久化

Debian + systemd 默认:

  • 日志在内存中
  • 重启后可能清空

查看:

journalctl -u node.service

如果为空,检查 service 文件:

[Service]
StandardOutput=journal
StandardError=journal

并确保:

sudo systemctl restart systemd-journald

3. 日志写文件,但路径不对 / 权限不足

例如:

fs.appendFile('/var/log/node/app.log', data)

常见问题:

  • /var/log/node 不存在
  • node 用户无写权限
  • 写入失败被吞掉

✅ 检查:

ls -ld /var/log/node
sudo -u node touch /var/log/node/test

4. 进程异常退出,日志缓冲未 flush

Node 是异步写入,如果:

  • process.exit()
  • OOM
  • kill -9

缓冲区里的日志会丢失

✅ 解决:

  • 不要用 process.exit(0) 强制退出
  • 用日志库(winston / pino)

5. 用了 PM2 但没开日志

PM2 默认有日志,但:

  • 删除过 ~/.pm2/logs
  • 或用了 pm2 delete

查看:

pm2 logs
ls ~/.pm2/logs

6. Docker / 容器环境

在容器里:

  • 日志在 stdout
  • 容器销毁就没了

✅ 正确方式:

  • 挂载 volume
  • 或接 logging driver

二、推荐的正确做法(防丢失)

✅ 使用日志库

const winston = require('winston')

logger.add(new winston.transports.File({ filename: 'app.log' }))

✅ systemd 示例

[Service]
ExecStart=/usr/bin/node /opt/app/index.js
StandardOutput=append:/var/log/node/app.log
StandardError=append:/var/log/node/error.log

三、快速自测问题

你可以回答这几个问题,我可以精确定位:

  1. 你是 systemd / pm2 / docker / 裸跑
  2. 日志是 console.log 还是写文件?
  3. 是“完全没日志”还是“重启后没了”?
  4. Debian 版本(cat /etc/os-release

我可以给你一份针对你环境的配置

0