求助:Python脚本提取NiFi日志中ERROR及处理器信息失败
NiFi ERROR日志信息提取脚本修复
问题背景
默认NiFi无内置监控功能,需从nifi-app.log中过滤ERROR级别日志及处理器相关信息,通过cat nifi-app.log | grep ERROR可得到如下格式的日志:
2022-08-04 23:39:13,790 ERROR [Timer-Driven Process Thread-3] org.apache.nifi.processors.kudu.PutKudu PutKudu[id=b0fb3488-6c64-1d43-8c99-eada1eb75718] Failed to write due to Row error for primary key="ce70cb52-1c1e-4dd4-a8e1-3fb658dfef45\x00\x00c23e26d7-144f-4f5b-b47e-f9fe0050af30\x00\x00\x80\x00\x01\x82l\x9A\xA3\x90", tablet=null, server=null, status=Not found: ([0x0000000280000181B70EA800, 0x000000038000000000000001))
该日志包含日期(2022-08-04)、时间(23:39:13)、日志级别(ERROR)、处理器名称(PutKudu)、处理器ID(b0fb3488-6c64-1d43-8c99-eada1eb75718)、异常信息等内容。
原脚本失败原因
原脚本核心错误是使用split("~")分割日志内容,但目标日志中不存在~分隔符,导致所有基于此的分割操作全部失效。此外,原脚本的字符串分割逻辑过于复杂且依赖不稳定的空格分割,容错性极低。
修复后的提取脚本
使用正则表达式匹配固定格式的日志字段,更可靠且易维护:
import re # 定义日志匹配正则,覆盖所有需要提取的字段 log_pattern = re.compile( r'^(\d{4}-\d{2}-\d{2}) (\d{2}:\d{2}:\d{2}),\d+ (\w+) \[.+\] .+\.(\w+) \w+\[id=([0-9a-f-]+)\] (.+)$' ) # 读取过滤后的ERROR日志文件(也可直接读取原nifi-app.log并过滤) output_lines = [] with open('nifi-app-error.log', 'r') as f: for line in f: line = line.strip() match = log_pattern.match(line) if match: date = match.group(1) time = match.group(2) log_level = match.group(3) processor = match.group(4) processor_id = match.group(5) message = match.group(6).replace(',', ':') # 按需求替换逗号为冒号 # 按指定格式拼接结果 output_line = f"{log_level},{processor_id},{processor},{message},{date},{time}" output_lines.append(output_line) # 将结果写入新文件 with open('nifi-error-extract-result.csv', 'w') as out_f: out_f.write('\n'.join(output_lines))
脚本说明
- 正则表达式
log_pattern精准匹配日志各字段:(\d{4}-\d{2}-\d{2}):匹配日期(如2022-08-04)(\d{2}:\d{2}:\d{2}):匹配时间(如23:39:13)(\w+):匹配日志级别(如ERROR)(\w+):匹配处理器名称(如PutKudu)([0-9a-f-]+):匹配处理器ID(UUID格式)(.+):匹配剩余的异常信息
- 处理后的结果按
日志级别,处理器ID,处理器,异常信息,日期,时间格式写入目标文件,可直接用于后续分析。
内容的提问来源于stack exchange,提问作者Bigvision tech
相关产品推荐
相关产品推荐

