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.
相关产品推荐
相关产品推荐

