kafka-dump-log 是什么
kafka-dump-log.sh 是 Kafka 自带的离线工具,直接解析磁盘上的日志段文件,打印批次头信息与消息内容(含位移、时间戳、压缩编解码器)。它不经过 Broker 服务,因此能看到「真正落盘的东西」:用于验证消息是否写入成功、核对压缩前后的数据量、排查消费位点与落盘内容不一致,以及检查索引文件是否损坏。
基本信息
| 适用范围 | Apache Kafka 发行包 bin/ 目录,需在 Broker(或副本所在的)节点上对日志目录执行 |
|---|---|
| 常用参数 | --files、--print-data-log、--deep-iteration、--index-sanity-check、--verify-index-only |
| 执行方式 | 与 Broker 是否运行无关,无需停服 |
| 目录位置 | log.dirs 下 <topic>-<partition>/,段文件形如 00000000000000000000.log |
| 输出内容 | 批次头(baseOffset、lastOffset、压缩编解码器、位置、大小)+ 消息键值 |
| 权限要求 | 读取日志目录的权限,建议用 broker 运行用户或复制副本文件后只读分析 |
典型使用场景
- 验证消息是否落盘:消费端说没收到,先看段文件里到底有没有
- 核对数据量:统计某段消息条数,与生产者发送量对比
- 排查消费错乱:确认同一分区内的实际位移顺序
- 检查压缩:查看压缩编解码器与实际消息内容,定位解压问题
- 索引体检:用索引一致性检查判断是否因异常宕机导致索引损坏
读取日志段内容
读取日志段内容
# 先看目录里有哪些段文件
ls /data/kafka/orders-0/ | head
# 打印消息内容(含键值),观察前 20 条
kafka-dump-log.sh --files /data/kafka/orders-0/00000000000000000000.log \
--print-data-log | head -20
# 批次内部被压缩时用深度遍历,展开压缩批次里的每条消息
kafka-dump-log.sh --files /data/kafka/orders-0/00000000000000000000.log \
--deep-iteration --print-data-log | head -20
# 索引一致性检查:只校验索引,不打印消息内容
kafka-dump-log.sh --files /data/kafka/orders-0/00000000000000000000.log \
--index-sanity-check统计与过滤
统计与过滤
# 统计段内消息条数(按批次头的 count 字段累加)
kafka-dump-log.sh --files /data/kafka/orders-0/*.log --print-data-log \
| grep -c '^offset:'
# 搜索特定业务键,确认某条变更是否真的写进来了
kafka-dump-log.sh --files /data/kafka/orders-0/*.log --print-data-log \
| grep -m 5 'order_id=10086'输出逐列读法
| 字段 | 含义 | 异常表现 |
|---|---|---|
| baseOffset / lastOffset | 该批次的起始与结束位移 | 两批位移不连续说明批次被截断 |
| count | 批次内消息条数 | 为 0 且非控制批次说明文件损坏 |
| compresscodec | 压缩编解码器(NONE、gzip、snappy、lz4、zstd) | 与配置不一致说明配置被改而未重建 |
| position / size | 消息在文件中的位置与长度 | 越界说明索引与日志不匹配 |
| CreateTime | 消息创建时间(LogAppendTime 时为写入时间) | 时间明显异常需确认时间戳类型配置 |
| isvalid | 该批次校验是否通过 | false 表示 CRC 校验失败,文件已损坏 |
对正在写入的段读取可能只看到已刷盘部分:dump 结果反映读取时刻的内容,不包含仍在页缓存中未落盘的消息。需要精确结论时先停写或选已关闭的段。
不要在原始日志目录上执行任何写操作,也不要用 dump 结果做全量统计:段文件只覆盖部分位移区间,把它当完整数据集会得出错误结论。