在 Linux 上 Node.js 日志“丢失”通常不是真的被删了,而是写到了你没想到地方、被轮转/覆盖、进程崩溃没 flush、或权限/路径问题。下面按最常见场景给你一套排查和找回思路。
ps -ef | grep node
重点看:
> app.log 2>&1 &| 场景 | 日志位置 |
|---|---|
node app.js > log.txt |
当前目录或你指定的文件 |
| PM2 | ~/.pm2/logs/ |
| systemd | journalctl -u your-service |
| Docker | docker logs 容器名 |
代码里 winston / pino |
配置的文件路径 |
pm2 logs
pm2 logs app-name
历史日志:
ls ~/.pm2/logs/
如果开启了日志分割:
pm2 install pm2-logrotate
journalctl -u your-node-service
journalctl -u your-node-service --since "2 hours ago"
导出:
journalctl -u your-node-service > node.log
可能原因:
logrotate 移走查找:
find / -name "*.log" 2>/dev/null | grep node
看是否被轮转:
ls -lh /var/log/
Node 崩溃时:
console.log 可能没 flush解决:
process.on('exit')pino(高性能、少丢)docker logs 容器ID
docker logs --since 1h 容器ID
防止丢失:
logging:
driver: json-file
options:
max-size: "10m"
max-file: "3"
lsof | grep deleted
找到:
node 12345 user 1w REG ... /app/log (deleted)
恢复:
cp /proc/12345/fd/1 ./recovered.log
基本无法恢复,除非:
extundelete)✅ 用专业日志库
const pino = require('pino')
const logger = pino({ level: 'info' }, pino.destination('/var/log/app.log'))
✅ 不要只依赖 stdout
✅ 配置 logrotate
✅ PM2 / systemd 管理进程
✅ 重要日志接 ELK / Loki
如果你愿意,可以补这些信息,我能直接定位:
我可以直接给你对应命令。