用Python实现“规则引擎”

2024-09-23 00:23:19 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在用Python编写一个日志收集/分析应用程序,我需要编写一个“规则引擎”来匹配和处理日志消息。

它需要具备:

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

我设想一个示例规则可能是这样的:

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

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

当前(尚未实现)的设计是为每个规则类型都有类,并根据解析树将它们构造和链接在一起。然后,每个规则都有一个“matches”方法,该方法可以接受一个消息对象返回,不管它是否与规则匹配。

很快,比如:

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()方法链接在一起,该方法将向下级联,直到对所有规则求值。

我只是想知道这是一个合理的方法,还是我的设计和想法完全不正常?不幸的是,我从来没有机会参加编译器设计课程或类似的东西在大学,所以我几乎提出了我自己的东西。

有这方面的经验的人可以插嘴评价一下这个想法吗?

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

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

我看不出规则的复杂度超过中等,它们将应用于链(列表),直到匹配的警报或忽略规则被命中。然而,这一部分与这个问题并不十分相关。

至于语法接近Python语法,是的,这是真的,但是我认为很难将Python过滤到这样的程度:用户不能不经意地使用一些不想使用的规则做一些疯狂的事情。


Tags: 方法self消息messageinit规则defmatch
3条回答

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

要么使用Python,要么使用一些其他现有的、已经调试过的工作语言,比如BPEL。

只需用Python编写规则,导入并执行它们。生活更简单,更容易调试,而且您实际上已经解决了实际的日志读取问题,而没有创建另一个问题。

想象一下这个场景。你的程序中断了。现在要么是规则解析,要么是规则执行,要么是规则本身。你必须把这三个都调试好。如果你用Python编写规则,那就是规则,那就是规则。

“我认为很难将Python过滤到这样的程度:用户不可能不经意地用一些不符合预期的规则做一些疯狂的事情。”

这主要是“我想编写编译器”参数。

1)您是主要用户。您将编写、调试和维护规则。真的有一群疯狂的程序员会做疯狂的事情吗?真正地?如果有任何潜在的疯狂用户,与他们交谈。教他们。不要通过发明一种新的语言来对抗它们(这样你就必须永远维护和调试它)

2)只是日志处理。对那些疯狂的人来说没有什么真正的代价。没有人会用错误的日志处理来颠覆世界经济体系。不要用几十行Python在1000行解释器上做一个小任务来解释几十行某种规则语言。只需写出几十行Python。

只要用Python尽快清晰地编写它,然后继续下一个项目。

你考虑过内布里奥斯吗?我们只是在为自己的目的构建了这个工具之后发布了它。它是一个纯Python/Django规则引擎。我们实际上将它用于工作流任务,但它足够通用,可以在您的情况下帮助您。您需要连接到远程数据库并对其运行规则。

您编写的Python最终将成为系统中的多个规则。举个例子:

class SeverityRule(NebriOS):
    # add listener or timer here

check(self):
    if operator == ">="
    return message.severity >= severity
    # any number of checks here


action(self):
    csv.append(message.severity, datetime.now)
    send_email(kamil@example.com, """Severity level alert: {{message.severity}}""")

http://nebrios.com查看。直到我的团队开始工作之后,我才意识到构建像Nebri这样的规则引擎应用程序有多重要。这是一项更为艰巨的任务。ACL、队列、表单、KVPS、有效的检查、有用的错误、电子邮件解析、动态表单和列表继续。

你可能还想看看PyKE

相关问题 更多 >