解析数千种不同日志类型的最直观的方法(使用Python)?

解析数千种不同日志类型的最直观的方法(使用Python)?,python,regex,parsing,aws-lambda,bigdata,Python,Regex,Parsing,Aws Lambda,Bigdata,今年夏天,我在一家小公司实习,负责解析来自动觉流的日志文件。这具有极高的吞吐量,因此我一直在学习如何进行“实时”解析,因为没有更好的术语,以避免内存膨胀和在lambda中产生额外成本 我进入该项目时,期待着一些乏味但易于管理的事情,但我遇到了几个问题: 分隔符在从多个来源聚合到我收到它们时的日志之间的某个点“在转换中丢失”。我不能轻易地做任何事情,比如在制表符、4个空格、2个空格、3个空格、冒号、逗号等等,因为它往往会在意外点断开日志 显然有数千种类型的日志需要处理和分析。其中许多都来自“相同”

今年夏天,我在一家小公司实习,负责解析来自动觉流的日志文件。这具有极高的吞吐量,因此我一直在学习如何进行“实时”解析,因为没有更好的术语,以避免内存膨胀和在lambda中产生额外成本

我进入该项目时,期待着一些乏味但易于管理的事情,但我遇到了几个问题:

  • 分隔符在从多个来源聚合到我收到它们时的日志之间的某个点“在转换中丢失”。我不能轻易地做任何事情,比如在制表符、4个空格、2个空格、3个空格、冒号、逗号等等,因为它往往会在意外点断开日志

  • 显然有数千种类型的日志需要处理和分析。其中许多都来自“相同”的来源(例如MSWinEventLog),但它们本身仍然是独一无二的。Windows日志约占随机样本的85%。提供给我的日志类型电子表格记录了许多类型日志的“0”个实例,但我假设它们的存在意味着它们在收集期之外的某个时间点被观察到

  • 每次我想我在一个特定类型的日志中发现一个模式,一个来自不同的源并杀死它。除附加冒号的Windows事件号特定数据外,大部分字段的名称不包括在内

    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多个句子)

    我担心的是,因为日志的数量太大,所以很难解释可能进入解析器的每个日志,尤其是在一种日志类型中,它们的格式并不总是相同的情况下(我注意到日期/时间在顺序和分隔符上都极不一致)。对一个人(我)来说,写几千个正则表达式似乎也不现实

    所以我想我的问题是:对于那些处理过类似混乱情况的人来说,我该如何处理这些问题,并修复我现在用管道胶带粘在一起的意大利面呢

  • 高频输入
  • 行分隔文本
  • 语义未知的日志模式
  • 被一些
  • 罕见“他人”的长尾
  • 我以前做过基于python生成器的分阶段处理,可以很好地扩展。不过,它不会自动进行免费的机器学习

    因此,如果输入像上面描述的那样是高度未指定的,但有一个主要的已知部分核心(OP指出,一个已定义物种的85%),那么它有助于将“检测”与解析清楚地分开

    任何不符合日益完善的封装规则的东西都会被放入一个“terra incognita”桶中进行手动检查(可能会用阈值检测器的提示进行标记)

    大部分将被交给匹配的解析器并被完全处理

    最好是,让一些利益相关者,允许a)最终跳过或b)简单地将未知信息收集到像日志一样的检查日志中,用于存档或采样或其他任何用途


    如果你是一个人,似乎没有100%的工作解决方案(在我的理解中,这意味着:“所有解析”),因为更多的自动化可能会导致更多错误检测格式-错误将降低结果质量。很少发生的模式实例可能发生在您“离开大楼”之后,但我不会打赌,我个人也不会建议这种态度;-)

    我只能用以下方式给你答案:
    多工具,可以做一切不是解决方案,它几乎不可能写一个工具,可以解析任何日志,并提供给您一个正确的信息,对任何类型的日志飞行您必须维护/支持您所做的工作。

    要执行计划: 方案A:

  • 试着去理解为什么你被要求去解析,以及为什么你被要求去解析 日志:去找你的同事/经理,安排会议并找出答案 你真正需要做的事情。并可能减少用于解析的日志数量
  • 准备一组记录 您已经拥有并尝试找出这些日志中的哪些是 批评的从为它们编写解析器开始
  • 为只具有基本功能(读取、解析、保存等)的解析日志准备基本
    class
  • 准备具有自己的模式和方法的类,以便解析关键类型的日志。继承自#3
  • 不匹配的日志
    准备类,该类将保存所有未分析的新日志以供将来分析。继承自#3
  • 不匹配的日志进行分析
    并重复#4
  • <