在 Ubuntu 上运行 Node.js 时“日志丢失”是一个比较常见的问题,通常不是 Node.js 本身把日志删了,而是运行方式、输出重定向、进程管理或系统日志机制导致的。下面按最常见原因逐一说明,并给出排查和解决办法。
& 或 nohup 启动,但没重定向 stdout/stderrnode app.js &
✅ 正确做法:
node app.js >> /var/log/node/app.log 2>&1 &
或
nohup node app.js >> /var/log/node/app.log 2>&1 &
PM2 默认有日志,但:
~/.pm2/logs/pm2 flush 清空检查:
pm2 logs
pm2 describe app
确认:
pm2 restart app
pm2 flush # 清空日志(慎用的)
如果你用 systemd 管理 Node.js:
[Service]
ExecStart=/usr/bin/node /opt/app/app.js
默认:
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
Ubuntu 默认有 logrotate:
检查:
ls -l /var/log/node/
cat /etc/logrotate.d/node
✅ 解决:
Node.js 是异步的:
console.log 不一定立即落盘kill -9 → 缓冲丢失✅ 建议:
winston / pinofs.appendFileSync查看:
docker logs container_id
示例(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)我可以直接帮你定位到具体哪一步丢的。