首页/数据/数据工程与 ETL 速查/kafka-dump-log.sh 读取日志段
Kafka64 条

kafka-dump-log.sh 读取日志段

直接解析磁盘上的日志段文件查看消息内容、位移与时间戳,用于验证消息是否真正落盘、核对压缩前后数据、排查消费与落盘不一致。

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 结果做全量统计:段文件只覆盖部分位移区间,把它当完整数据集会得出错误结论。

易错点

  • 把 dump 结果当全量数据做统计,段文件只覆盖部分区间,结论不可靠
  • 目录权限不足导致读取失败,应用 broker 运行用户或复制文件后再分析
  • 忽略 isvalid=false 的批次,文件已损坏却继续按正常数据排查
  • 对正在写入的活跃段读取后就下「数据没落盘」的结论,未考虑未刷盘部分
  • 在生产高峰对整目录全量 dump,大量顺序读 IO 影响在线写入性能

数据来源与参考

  • Apache Kafka 官方文档:kafka-dump-log.sh
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌