You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python解析带缩进的日志文本生成指定嵌套字典

Hive on Tez计数器日志解析方案

场景说明

现有存储Hive on Tez任务运行计数器日志的文本文件,日志格式示例如下:

INFO  : org.apache.tez.common.counters.DAGCounter:
INFO  :    NUM_SUCCEEDED_TASKS: 58
INFO  :    TOTAL_LAUNCHED_TASKS: 58
INFO  :    DATA_LOCAL_TASKS: 26
INFO  : File System Counters:
INFO  :    FILE_BYTES_READ: 954341
INFO  :    FILE_BYTES_WRITTEN: 207491
INFO  : org.apache.tez.common.counters.TaskCounter:
INFO  :    REDUCE_INPUT_GROUPS: 1200
.
.
.
INFO  : TaskCounter_Reducer_2_OUTPUT_out_Reducer_2:
INFO  :    OUTPUT_RECORDS: 0
INFO  : org.apache.hadoop.hive.ql.exec.tez.HiveInputCounters:
INFO  :    GROUPED_INPUT_SPLITS_Map_1: 13
INFO  :    GROUPED_INPUT_SPLITS_Map_3: 10
INFO  : Completed executing command...

示例中的竖向省略号代表文件中间还有大量同格式的日志行,所有行缩进均使用空格实现,无制表符。

需求目标

基于行缩进规则解析日志,生成嵌套字典结构:

  • 顶级键为无额外前置缩进的计数器分类名称
  • 顶级键对应的值为该分类下带缩进的指标键值对集合
    期望输出结构示例:
{
"org.apache.tez.common.counters.DAGCounter" : {"NUM_SUCCEEDED_TASKS": 58 , "TOTAL_LAUNCHED_TASKS" : 58 , ...} ,
"File System Counters" : { ... } ,
 .
 .
 .
"org.apache.hadoop.hive.ql.exec.tez.HiveInputCounters" : { ... }
}

现有日志加载代码如下(无需调整),解析结果需存入预定义的DM字典:

DM={}
lines = []
with open(txt,'r') as txt:
    for line in txt:
        lines.append(line)

解析实现

直接遍历已加载的行数组,按前缀和缩进规则识别分类与指标即可,代码如下:

current_category = None

for raw_line in lines:
    # 过滤非日志内容行
    stripped_line = raw_line.strip()
    if not stripped_line.startswith("INFO  :"):
        continue
    # 提取INFO标记后的有效内容
    content = stripped_line[len("INFO  :"):].rstrip()
    if not content:
        continue
    # 跳过执行完成标记行
    if content.startswith("Completed executing command"):
        continue

    # 无前置空格为计数器分类行
    if not content.startswith(" "):
        # 若需要分类名保留末尾冒号,去掉下一行的rstrip(":")即可
        current_category = content.rstrip(":")
        DM[current_category] = {}
    # 有前置空格为当前分类下的指标行
    else:
        metric_line = content.strip()
        if ":" not in metric_line:
            continue
        metric_key, metric_value = metric_line.split(":", 1)
        # 指标值默认转整数,需要保留字符串则去掉int()包裹
        DM[current_category][metric_key.strip()] = int(metric_value.strip())

可选调整项

  • 若需要分类名称保留末尾的冒号,删除current_category = content.rstrip(":")中的.rstrip(":"),直接赋值为content即可
  • 若不需要将指标值转为整数,去掉int()转换,直接存储字符串格式的值
  • 代码会自动跳过空行、无效行、任务结束标记行,适配日志中省略的大量同类行场景

内容的提问来源于stack exchange,提问作者Zoi K.

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.30 21:18:56