解析数千种不同日志类型的最直观的方法(使用Python)?
今年夏天,我在一家小公司实习,负责解析来自动觉流的日志文件。这具有极高的吞吐量,因此我一直在学习如何进行“实时”解析,因为没有更好的术语,以避免内存膨胀和在lambda中产生额外成本 我进入该项目时,期待着一些乏味但易于管理的事情,但我遇到了几个问题:解析数千种不同日志类型的最直观的方法(使用Python)?,python,regex,parsing,aws-lambda,bigdata,Python,Regex,Parsing,Aws Lambda,Bigdata,今年夏天,我在一家小公司实习,负责解析来自动觉流的日志文件。这具有极高的吞吐量,因此我一直在学习如何进行“实时”解析,因为没有更好的术语,以避免内存膨胀和在lambda中产生额外成本 我进入该项目时,期待着一些乏味但易于管理的事情,但我遇到了几个问题: 分隔符在从多个来源聚合到我收到它们时的日志之间的某个点“在转换中丢失”。我不能轻易地做任何事情,比如在制表符、4个空格、2个空格、3个空格、冒号、逗号等等,因为它往往会在意外点断开日志 显然有数千种类型的日志需要处理和分析。其中许多都来自“相同”
heading1:field1:data1带空格的字段2:data2字段3:data3带空格的部分\u数据3值字段4:field5\u后带\u无\u值的部分\u数据5
现在我的方法有些幼稚,只针对Windows事件。它结合使用正则表达式和“智能对”解析。Regex可以得到一些我可以依赖的字段,并在配对时识别“关键元素”。配对适用于由冒号分隔的部分(对于powershell日志,则为“=”)。我尝试将所有字段和值分离到一个列表中。然后,对于每个元素,我检查它是否是键。如果是,我将它与下一个应该是值的元素配对。如果下一个元素也是键,那么最后一个元素要么是标题,要么是没有值的字段,并且被丢弃。在将键和值配对后,如果下一个元素与“something:”模式不匹配,那么我假设它是一个具有多个值的键。一旦遇到另一个键元素,则将该点之前的键:值添加到字典中。因此,从上述示例中,我(希望)得出以下结论:
"field1": "data1",
"field with spaces 2": "data2",
"field3": ["data3 with spaces", "also_part_of_data3values"],
"field5": "data5"
这种方法在某种程度上适用于windows日志。我尝试删减不必要的信息(例如,许多日志包含来自Windows的关于事件是什么的描述文本,可以是10多个句子)
我担心的是,因为日志的数量太大,所以很难解释可能进入解析器的每个日志,尤其是在一种日志类型中,它们的格式并不总是相同的情况下(我注意到日期/时间在顺序和分隔符上都极不一致)。对一个人(我)来说,写几千个正则表达式似乎也不现实
所以我想我的问题是:对于那些处理过类似混乱情况的人来说,我该如何处理这些问题,并修复我现在用管道胶带粘在一起的意大利面呢
如果你是一个人,似乎没有100%的工作解决方案(在我的理解中,这意味着:“所有解析”),因为更多的自动化可能会导致更多错误检测格式-错误将降低结果质量。很少发生的模式实例可能发生在您“离开大楼”之后,但我不会打赌,我个人也不会建议这种态度;-) 我只能用以下方式给你答案:
多工具,可以做一切不是解决方案,它几乎不可能写一个工具,可以解析任何日志,并提供给您一个正确的信息,对任何类型的日志飞行您必须维护/支持您所做的工作。 要执行计划: 方案A:
class
不匹配的日志
准备类,该类将保存所有未分析的新日志以供将来分析。继承自#3不匹配的日志进行分析
并重复#4