在 Ubuntu + Node.js 环境中,日志“丢失”通常不是真的消失了,而是被系统、进程管理工具或 Node.js 自身行为“吞掉/重定向/截断”了。下面按最常见原因 → 排查方式 → 解决办法系统说明。
如果你用 systemctl 启动 Node.js:
[Service]
ExecStart=/usr/bin/node /app/server.js
✅ stdout / stderr 默认由 systemd 接管
❌ 你在代码里 console.log() 不会写到文件
查看方式:
journalctl -u your-service-name -f
解决方式:
StandardOutput=append:/var/log/node/app.log
StandardError=append:/var/log/node/app-error.log
或:
StandardOutput=journal+console
PM2 日志默认在:
~/.pm2/logs/
常见问题:
pm2 flush 清空排查:
pm2 logs
pm2 list
解决:
pm2 flush # 清空(确认是否误删)
pm2 restart all
✅ 建议配置:
pm2 start app.js --log /var/log/node/app.log
Node.js 在非 TTY 环境(服务器)中:
console.log 是 块缓冲✅ 表现:
解决:
process.stdout._handle?.setBlocking(true)
或使用:
console.error() // stderr 默认不缓冲
未捕获异常会导致:
常见原因:
throw new Error('db fail')
解决:
process.on('uncaughtException', (err) => {
console.error('UNCAUGHT:', err)
})
process.on('unhandledRejection', (err) => {
console.error('REJECTION:', err)
})
常见错误写法:
node app.js > app.log
再次启动时:
node app.js > app.log # 会清空
✅ 正确:
node app.js >> app.log
Ubuntu 默认会轮转 /var/log
检查:
cat /etc/logrotate.d/node
可能配置:
rotate 7
missingok
✅ 导致:旧日志被删
df -h
df -i
✅ 表现:
如果你在 Docker 中运行 Node.js:
✅ 查看:
docker logs <container>
✅ 解决:
| 现象 | 真实原因 |
|---|---|
| 没看到日志 | stdout 被 systemd 接管 |
| 日志突然没了 | 进程崩溃 |
| 文件是空的 | 缓冲未刷新 |
pm2 start app.js --name api --log /var/log/node/api.log
或:
const fs = require('fs')
const log = fs.createWriteStream('/var/log/node/app.log', { flags: 'a' })
log.write('hello\n')
或直接使用日志库:
winstonpino(高性能,推荐)你可以按顺序检查:
# 1. systemd
journalctl -u your-service -f
# 2. PM2
pm2 logs
# 3. 磁盘
df -h
# 4. Node 是否崩溃
dmesg | tail
# 5. 是否捕获异常
grep -R "uncaughtException" .
如果你愿意,可以告诉我:
console.log 还是写文件我可以 直接帮你定位到是哪一条原因。