在 Linux 上 Node.js 日志“丢失”通常不是真的没产生,而是被重定向、缓冲、覆盖或进程异常退出导致看不到。下面按最常见原因给你系统梳理。
很多 Node 服务这样启动:
node app.js &
或
npm start &
日志其实是:
console.log → stdoutconsole.error → stderr但:
✅ 解决:
node app.js > app.log 2>&1 &
或 systemd / pm2 / docker logs
PM2 默认日志在:
~/.pm2/logs/
你可能只看了 console,但 PM2 已经接管输出。
✅ 查看:
pm2 logs
Node 是异步 + 有缓冲的:
console.log 不是立即写磁盘kill -9 / OOM / 崩溃 → 缓冲丢失✅ 解决:
process.on('exit')kill -9如果你用 systemd:
[Service]
ExecStart=/usr/bin/node app.js
日志在:
journalctl -u your-service
✅ 不要自己写文件,先查 journalctl
logrotate 可能:
✅ 现象:
lsof | grep deleted 有 node 进程✅ 解决:
copytruncateconsole.log:
✅ 正确方式:
const winston = require('winston')
或
const pino = require('pino')
process.on('uncaughtException', e => {
console.error(e)
})
否则:
Docker 默认只看 stdout/stderr
✅ 正确:
console.log(...) // 不要写本地文件
然后:
docker logs container
你可以挨个确认:
console.log 还是写文件?✅ 最佳实践:
如果你愿意,可以贴:
我可以直接帮你定位到是哪一条原因。