温馨提示×

ubuntu nodejs日志为何丢

小樊
40
2026-09-30 16:00:44
栏目: 编程语言

在 Ubuntu 上运行 Node.js 时“日志丢失”是一个比较常见的问题,通常不是 Node.js 本身把日志删了,而是运行方式、输出重定向、进程管理或系统日志机制导致的。下面按最常见原因逐一说明,并给出排查和解决办法。


一、最常见原因

1️⃣ 用 & 或 nohup 启动,但没重定向 stdout/stderr

node app.js &
  • 日志输出到终端
  • 终端关闭 → 输出直接丢失
  • 不会写文件,也不会进 syslog

✅ 正确做法:

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

或

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

2️⃣ 使用 PM2 但没开日志或日志被轮转

PM2 默认有日志,但:

  • 日志在 ~/.pm2/logs/
  • 磁盘满 / 权限问题会导致写不进去
  • 日志被 pm2 flush 清空

检查:

pm2 logs
pm2 describe app

确认:

pm2 restart app
pm2 flush   # 清空日志(慎用的)

3️⃣ systemd 服务但没配置 StandardOutput

如果你用 systemd 管理 Node.js:

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

默认:

  • 日志进了 journald
  • 不是文件
  • 可能被 journalctl 清理策略丢掉

查看:

journalctl -u your-node-service

✅ 推荐配置:

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

然后:

systemctl daemon-reload
systemctl restart your-node-service

4️⃣ 日志被 logrotate 删了

Ubuntu 默认有 logrotate:

  • 文件被 renamed
  • Node.js 仍写旧文件描述符
  • 看起来“日志没了”

检查:

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

✅ 解决:

  • 使用支持 SIGUSR1 的日志库
  • 或 PM2 / winston + 每日文件

5️⃣ 进程崩溃,日志还没 flush

Node.js 是异步的:

  • console.log 不一定立即落盘
  • 进程被 kill -9 → 缓冲丢失

✅ 建议:

  • 用 winston / pino
  • 重要日志用 fs.appendFileSync

6️⃣ Docker / 容器环境(如果你在容器里)

  • 日志在容器 stdout
  • 容器删除 → 日志没了

查看:

docker logs container_id

二、推荐的标准做法(生产环境)

✅ 最稳方案

  • 用 PM2 / systemd
  • 用 winston / pino
  • 日志写文件 + logrotate
  • 同时接 journald(可选)

示例(winston):

const winston = require('winston');
winston.add(new winston.transports.File({
  filename: '/var/log/node/app.log'
}));

三、快速自查清单

# 1. 看进程怎么起的
ps aux | grep node

# 2. 看日志文件
ls -l /var/log/node

# 3. systemd?
journalctl -u your-service -n 100

# 4. PM2?
pm2 logs

如果你愿意,可以贴:

  • 启动命令(node xxx / pm2 / systemd)
  • 是否容器
  • 日志“丢”的具体表现(文件空?进程重启?)

我可以直接帮你定位到具体哪一步丢的。

0 踩