温馨提示×

linux nodejs日志丢失怎么找回

小樊
39
2026-10-23 02:44:10
栏目: 编程语言

在 Linux 上 Node.js 日志“丢失”通常不是真的被删了,而是写到了你没想到地方、被轮转/覆盖、进程崩溃没 flush、或权限/路径问题。下面按最常见场景给你一套排查和找回思路。


一、先确认:日志到底写哪儿了

1. 看启动方式

ps -ef | grep node

重点看:

  • 是否带 > app.log 2>&1 &
  • 是否用了 PM2 / systemd / docker

2. 常见日志位置

场景 日志位置
node app.js > log.txt 当前目录或你指定的文件
PM2 ~/.pm2/logs/
systemd journalctl -u your-service
Docker docker logs 容器名
代码里 winston / pino 配置的文件路径

二、不同场景如何“找回”

✅ 场景 1:用了 PM2(最常被问)

pm2 logs
pm2 logs app-name

历史日志:

ls ~/.pm2/logs/

如果开启了日志分割:

pm2 install pm2-logrotate

✅ 场景 2:用 systemd 启动

journalctl -u your-node-service
journalctl -u your-node-service --since "2 hours ago"

导出:

journalctl -u your-node-service > node.log

✅ 场景 3:日志文件“不见了”

可能原因:

  • 被 logrotate 移走
  • 被覆盖
  • 写到了相对路径

查找:

find / -name "*.log" 2>/dev/null | grep node

看是否被轮转:

ls -lh /var/log/

✅ 场景 4:进程崩溃导致日志没写入

Node 崩溃时:

  • console.log 可能没 flush
  • 文件流未关闭

解决:

  • 用 process.on('exit')
  • 用 pino(高性能、少丢)
  • 不要在崩溃时只靠 stdout

✅ 场景 5:Docker 容器日志丢失

docker logs 容器ID
docker logs --since 1h 容器ID

防止丢失:

logging:
  driver: json-file
  options:
    max-size: "10m"
    max-file: "3"

三、如果真的“被删了”还能找回吗?

⚠️ 文件被 rm,但进程还在写

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


五、你可以直接告诉我

如果你愿意,可以补这些信息,我能直接定位:

  1. 怎么启动 Node(命令 / PM2 / systemd / Docker)
  2. 用的什么日志方案(console / winston / pino)
  3. 日志“丢失”是:没生成 / 被覆盖 / 文件没了

我可以直接给你对应命令。

0 踩