温馨提示×

nodejs日志丢失怎么排查

小樊
41
2026-10-02 14:46:00
栏目: 编程语言

Node.js 日志“丢失”通常不是真的没了,而是没写到你以为的地方、被缓冲/截断、进程异常退出或被日志库吞掉。下面按最常见原因 → 排查步骤 → 实战命令来梳理。


一、先确认“日志丢失”的本质

先问自己 3 个问题:

  1. 完全没日志?还是部分丢失?
  2. 服务是正常退出,还是崩溃/OOM?
  3. 用的什么日志方式?
    • console.log
    • winston / pino / log4js
    • pm2 logs
    • 容器(docker logs)

二、最常见原因 & 排查清单

1️⃣ console.log 被缓冲(最常见)

现象

  • 本地有日志,服务器没有
  • 崩溃前最后几行日志没了

原因

  • stdout 是块缓冲(非 TTY)
  • 进程 kill -9 / 崩溃时缓冲没刷盘

排查

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

对比:

node app.js | cat

解决

  • 用日志库(pino / winston)
  • 或强制 flush:
process.on('exit', () => {
  // 不推荐,仅调试
})

2️⃣ 进程异常退出(日志来不及写)

典型信号

  • 最后一行是业务日志
  • 没有 uncaughtException / unhandledRejection

排查

dmesg | grep -i kill
journalctl -u your-service

加兜底

process.on('uncaughtException', e => {
  console.error('FATAL', e);
  process.exit(1);
});

3️⃣ 日志写文件但路径不对

常见坑

  • 相对路径
  • 容器里写进了临时层

排查

lsof -p <pid> | grep log

正确做法

const path = require('path');
const logFile = path.resolve('/var/log/app/app.log');

4️⃣ 日志库配置问题(被 level 过滤)

winston 示例

level: 'info' // debug 没了

排查

logger.level = 'debug';

pino 注意

pino({ level: 'info' })

5️⃣ PM2 / Docker 日志隔离

PM2

pm2 logs
pm2 flush   # 清空了!

Docker

docker logs --tail=100 <container>

注意:

  • 日志驱动是 json-file 还是 none
  • 是否挂载了 volume

6️⃣ 日志被 rotate / 覆盖

  • logrotate 截断
  • 多进程写同一文件(winston 默认不支持)

解决

  • 用 pino + pino-roll
  • 或集中式日志(ELK / Loki)

三、标准排查流程(推荐)

  1. 确认进程是否还活着
ps aux | grep node
  1. 看 stdout / stderr
journalctl -u your-app
  1. 加最小日志验证
console.error('BOOT', Date.now());
  1. 用 pino 快速验证
const pino = require('pino');
const logger = pino({ level: 'debug' });
logger.info('test');

四、如果你愿意,我可以直接帮你定位

你可以贴:

  • Node 版本
  • 启动方式(pm2 / docker / systemd)
  • 用的日志库
  • “丢失”的具体场景(崩溃?重启?高峰期?)

我可以直接给你针对性排查命令 + 配置示例。

0 踩