故障信息收集:日志收集、现场信息采集、用户反馈整理、环境快照

故障复现的第一步,说白了就是「把现场封存好」。

我见过太多工程师,一上来就急着翻代码、查逻辑,结果折腾半天发现——日志不全、环境变了、用户说的和实际对不上。白白浪费一整天。

信息收集不是体力活,是技术活。你得知道:该收什么、怎么收、收完怎么管。

2.1 日志收集——故障分析的「第一手证据」

日志是故障现场最直接的记录。但很多人有个误区:日志越多越好。其实不是。

我个人习惯是:先定范围,再动手收。

2.1.1 日志分类与优先级

日志类型 优先级 典型内容 收集要点
应用日志 ★★★★★ 业务异常、调用链、错误堆栈 保留完整时间戳,不要截断
系统日志 ★★★★☆ 内核报错、OOM、磁盘I/O异常 关注故障前后各30分钟
中间件日志 ★★★★☆ 数据库慢查询、MQ堆积、连接池耗尽 收集配置文件和运行日志
网络日志 ★★★☆☆ 丢包、重传、延迟抖动 配合tcpdump抓包更佳
硬件日志 ★★★☆☆ 温度、电压、风扇转速 IPMI/BMC日志不可忽略
我的习惯:每次收日志前,先画一条时间线。把故障发生时间、首次发现时间、影响范围标出来。然后按时间线切分日志,只保留「故障前10分钟到故障后5分钟」的核心窗口。剩下的归档,但不删。

2.1.2 日志收集的「三要三不要」

  • 要保留原始格式——别用Excel打开再另存,格式会乱。直接用 cat 或 tail 导出纯文本。
  • 要记录收集时间——你什么时候拿到的日志?这个时间本身也是线索。
  • 要校验完整性——用 wc -l 对比行数,用 md5sum 做校验。
  • 不要只收错误级别——INFO和DEBUG里经常藏着关键上下文。
  • 不要覆盖旧日志——每次收集单独建文件夹,别覆盖。
  • 不要用压缩工具直接打开——解压到临时目录再查看,避免文件损坏。
我曾经踩过的坑:有一次线上故障,我让运维把应用日志发给我。他直接 tar.gz 打包,然后通过即时通讯软件传过来。结果解压时发现文件头损坏,日志全废了。后来我定了个规矩:日志传输必须带校验和,且保留原始压缩包。

2.2 现场信息采集——别让「环境」成为变量

故障复现最怕什么?最怕环境变了。

你想想看,开发环境跑得好好的,生产环境就崩。为什么?因为环境不一样。所以现场信息采集,核心就是把「环境快照」拍下来。

2.2.1 环境快照清单

采集项 命令/工具 关键信息
操作系统版本 cat /etc/os-release 内核版本、发行版、补丁级别
资源使用率 top / htop / free -m CPU、内存、Swap使用情况
磁盘状态 df -h / iostat -x 1 分区使用率、I/O等待时间
进程快照 ps aux --sort=-%mem 进程列表、资源占用、启动时间
网络连接 ss -tuln / netstat -anp 监听端口、连接状态、对端地址
依赖服务状态 systemctl status 数据库、缓存、消息队列是否正常

核心原则:环境快照必须在「故障未恢复」或「刚恢复但未重启」时采集。一旦重启,很多线索就没了——比如临时文件、进程状态、网络连接。

2.2.2 现场采集的「五步法」

  1. 先拍照,后动刀——任何操作之前,先把当前状态完整记录一遍。
  2. 按层级采集——从硬件→操作系统→中间件→应用,逐层往下。
  3. 关注异常值——CPU 100%?内存快满了?磁盘I/O飙升?这些是重点。
  4. 保留原始输出——别只看摘要,把 top 的完整输出、dmesg 的全文都存下来。
  5. 标记时间戳——每条记录前面加上 date 输出,方便后续对齐。

2.3 用户反馈整理——别信「感觉」,要信「数据」

用户反馈是最容易出偏差的信息源。

我遇到过用户说「系统卡死了」,结果一看监控,CPU才用了5%。后来追问才知道,他说的「卡死」其实是某个页面加载慢,等了10秒。

所以,用户反馈必须结构化整理。

2.3.1 用户反馈模板

字段 说明 示例
故障时间 精确到秒,注明时区 2025-03-15 14:23:05 CST
操作路径 用户做了什么操作 点击「订单查询」→输入单号→点击「搜索」
预期结果 用户认为应该出现什么 页面显示订单详情
实际结果 用户实际看到了什么 页面白屏,浏览器控制台报错
影响范围 多少人受影响 该用户所在部门共15人
复现频率 每次必现/偶发/首次 偶发,今天出现3次
我的做法:让用户录屏。录屏比文字描述靠谱100倍。如果条件不允许,至少让用户截图,并标注操作顺序。

2.3.2 用户反馈的「三问法」

  • 第一问:你做了什么?——还原操作路径。
  • 第二问:你看到了什么?——记录实际现象。
  • 第三问:你觉得应该是什么?——确认预期结果。

这三问问完,80%的模糊信息都能澄清。剩下的20%,靠日志和环境快照来交叉验证。

2.4 信息归档——让每一条线索都可追溯

信息收集完了,不是扔到一个文件夹就完事。你得让后续的排查人员(包括未来的你自己)能快速找到需要的东西。

2.4.1 归档目录结构

fault_20250315_142305/
├── 01_logs/
│   ├── app_logs/
│   ├── sys_logs/
│   └── middleware_logs/
├── 02_env_snapshot/
│   ├── os_info.txt
│   ├── resource_usage.txt
│   ├── process_list.txt
│   └── network_status.txt
├── 03_user_feedback/
│   ├── feedback_form.md
│   ├── screenshots/
│   └── screen_recording.mp4
├── 04_config_backup/
│   ├── application.yml
│   └── nginx.conf
└── README.md
注意:README.md 里必须写清楚「收集时间」「收集人」「故障简述」「已知线索」。别偷懒,这个文件能救你的命。

2.5 信息收集的核心逻辑图

下面这张图,是我自己总结的信息收集流程。每次做故障排查前,我都会过一遍。

故障信息收集核心流程 故障信息收集核心流程 故障发生 日志收集 现场信息采集 用户反馈整理 应用/系统/中间件 环境快照/资源状态 结构化整理/录屏 信息交叉验证 信息归档(目录+README) 核心原则:先拍照后动刀 | 保留原始格式 | 按时间线切分 | 交叉验证

2.6 本章小结

信息收集是故障复现的基石。你收集得越完整、越规范,后续的定位就越快。

我个人总结了三句话,每次做故障排查前都会默念一遍:

  • 日志要全,但别贪多——按时间窗口切分,保留原始格式。
  • 环境要快照,别等重启——重启前把现场拍下来。
  • 用户反馈要结构化,别信感觉——用模板、录屏、截图说话。

记住:好的信息收集,能让故障定位时间缩短50%以上。反之,信息不全,你就是在盲人摸象。