温馨提示×

为何linux nodejs日志丢失

小樊
37
2026-10-26 02:29:51
栏目: 编程语言

Linux 下 Node.js 日志“丢失”是很常见的问题,通常不是真的没了,而是没写到你以为的地方,或者被系统/进程机制吞掉了。下面按最常见原因逐一说明,并给出排查和解决办法。


一、最常见原因汇总

1️⃣ 日志写到了 stdout / stderr,但你看错地方

Node.js 默认:

  • console.log → stdout
  • console.error → stderr

如果你是直接运行:

node app.js

日志只在当前终端显示,关闭终端就没了。

✅ 解决:

node app.js > app.log 2>&1

2️⃣ 使用 PM2 / systemd,但日志路径不对

PM2

PM2 默认日志在:

~/.pm2/logs/

查看:

pm2 logs
pm2 logs app

常见误区:

  • 以为 console.log 会写文件(不会)
  • 改了代码没 pm2 restart

systemd(systemctl)

如果你用:

[Service]
ExecStart=/usr/bin/node /app/app.js

日志在:

journalctl -u your-service

✅ 查看:

journalctl -u node-app -f

3️⃣ 日志被 log rotate 删了

Linux 常用 logrotate:

  • 日志太大
  • 被压缩
  • 被删除

检查:

ls -lh /var/log/
cat /etc/logrotate.d/node

✅ 解决:

  • 调整 logrotate 配置
  • 或日志框架做按天切割

4️⃣ 进程异常退出,缓冲没 flush

Node.js 是异步写日志,如果:

  • process.exit()
  • OOM 被杀
  • kill -9

缓冲区日志会丢。

✅ 解决:

  • 用 winston / pino
  • 不要用 process.exit(0) 立即退出
  • 捕获退出事件:
process.on('exit', () => {})

5️⃣ 使用了异步日志库但没 await / flush

例如:

  • winston(某些 transport)
  • pino(非同步模式)

✅ 建议:

  • 生产环境用 pino(快且稳)
  • 或确保 flush 完成再退出

6️⃣ Docker 容器日志“消失”

如果你在 Docker 里:

docker logs container

但:

  • 容器被删
  • 日志驱动是 none

✅ 检查:

docker inspect container | grep LogConfig

7️⃣ 权限问题导致写不进去

  • 日志目录无写权限
  • 以 root 启动,后来用普通用户

✅ 检查:

ls -ld /var/log/app
touch /var/log/app/test

二、推荐的生产级做法(防丢失)

✅ 标准组合

  • PM2 / systemd
  • pino / winston
  • stdout 输出 + 外部采集(ELK / Loki)

示例(pino):

const pino = require('pino')
const logger = pino()

logger.info('server started')

三、快速自查清单 ✅

  • [ ] console.log 还是日志库?
  • [ ] 用什么启动(node / pm2 / systemd / docker)?
  • [ ] 日志文件在哪?
  • [ ] 是否进程被 kill?
  • [ ] 是否被 logrotate 删?

如果你愿意,可以直接告诉我:

  1. 启动方式(node / pm2 / docker / systemd)
  2. 用的日志方式(console / winston / pino)
  3. 日志“丢失”的具体场景

我可以帮你精准定位。

0 踩