在Python中实现“规则引擎”

发布于 2021-01-29 17:06:12

我正在用Python编写日志收集/分析应用程序,并且需要编写一个“规则引擎”以匹配日志消息并对其执行操作。

它需要具有以下特征:

  • 邮件本身的正则表达式匹配
  • 邮件严重性/优先级的算术比较
  • 布尔运算符

我设想一个示例规则可能类似于:

(message ~ "program\\[\d+\\]: message" and severity >= high) or (severity >= critical)

我正在考虑使用PyParsing或类似方法实际解析规则并构建解析树。

我现在要记住的当前(尚未实现)的设计是为每种规则类型提供类,并根据解析树将它们构造并链接在一起。然后,每个规则将具有“匹配”方法,该方法可以使消息对象返回是否与规则匹配。

很快,类似:

class RegexRule(Rule):
    def __init__(self, regex):
         self.regex = regex

    def match(self, message):
         return self.regex.match(message.contents)

class SeverityRule(Rule):
    def __init__(self, operator, severity):
         self.operator = operator

    def match(self, message):
         if operator == ">=":
             return message.severity >= severity
         # more conditions here...

class BooleanAndRule(Rule):
    def __init__(self, rule1, rule2):
         self.rule1 = rule1
         self.rule2 = rule2

    def match(self, message):
          return self.rule1.match(message) and self.rule2.match(message)

然后,根据消息的解析树将这些规则类链接在一起,并在顶部规则上调用match()方法,该方法将向下层叠,直到评估所有规则。

我只是想知道这是否是一种合理的方法,还是我的设计和想法完全不合时宜?不幸的是,在Unviersity中,我从来没有机会上过编译器设计课程或类似的课程,因此我几乎完全是想出这样的东西。

有人在这些事情上有经验的人能请他报仇并评价这个想法吗?

编辑: 到目前为止,一些好的答案,这里有一些澄清。

该程序的目的是从网络上的服务器收集日志消息,并将其存储在数据库中。除了收集日志消息外,收集器还将定义一组规则,这些规则将根据条件匹配或忽略消息,并在必要时标记警报。

我看不到这些规则具有中等程度的复杂性,它们会应用到链(列表)中,直到命中匹配的警报或忽略规则。但是,这部分与问题不太相关。

到目前为止,语法接近于Python语法,是的,这是正确的。但是,我认为很难过滤Python到用户不能无意间使用不想要的规则做一些疯狂的事情的程度。

关注者
0
被浏览
47
1 个回答
  • 面试哥
    面试哥 2021-01-29
    为面试而生,有面试问题,就找面试哥。

    不要发明另一种规则语言。

    使用Python或使用其他一些已经调试和工作的现有语言,例如BPEL。

    只需用Python编写规则,将其导入并执行即可。生活变得更简单,调试起来也容易得多,并且您实际上已经解决了实际的日志读取问题,而没有造成其他问题。

    想象一下这种情况。您的程序中断。现在要么是规则解析,规则执行,要么是规则本身。您必须调试所有三个。如果您使用Python编写规则,那么规则就是那样。

    “我认为很难将Python过滤到用户无法无意地使用一些不规则的疯狂行为的程度。”

    这很大程度上是“我想编写一个编译器”参数。

    1)您是主要用户。您将编写,调试和维护规则。真的有疯狂的程序员大军在做疯狂的事情吗?真?如果有任何潜在的疯狂用户,请 与他们交谈
    。教他们。不要通过发明一种新的语言来对抗它们(然后您将不得不永远维护和调试它)。

    2)这只是日志处理。 疯狂
    没有真正的代价。没有人会用错误的日志处理来颠覆世界经济体系。不要将几十行Python放在1000行解释器上来完成小任务,以解释几十行某些规则语言。只需编写几十行Python。

    只需尽可能快速,清晰地用Python编写它,然后继续进行下一个项目即可。



知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看