我正在用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过滤到用户无法无意中使用非预期规则做一些疯狂的事情的程度.
不要发明另一种规则语言.
要么使用Python,要么使用其他现有的,已调试的工作语言,如BPEL.
只需在Python中编写规则,导入它们并执行它们.生活更简单,更容易调试,并且您实际上已经解决了实际的日志读取问题而没有产生另一个问题.
想象一下这个场景.你的节目中断了.它现在要么是规则解析,要么是规则执行,要么是规则本身.你必须调试这三个.如果你用Python编写规则,那就是规则,就是这样.
"我认为很难将Python过滤到用户不会无意中使用非预期规则做一些疯狂事情的程度."
这主要是"我想写一个编译器"的论点.
1)您是主要用户.您将编写,调试和维护规则.真的有疯狂的程序员会做疯狂的事吗?真?如果有任何潜在的疯狂用户,请与他们交谈.教他们.不要通过发明一种新语言来对抗它们(你必须永远保持和调试它们.)
2)这只是日志处理.疯狂没有真正的代价.没有人会因为错误的日志处理而颠覆世界经济体系.不要用几十行Python在一个1000行解释器上做一个小任务来解释一些规则语言的几十行.只需编写几十行Python.
尽可能快速,清晰地用Python编写,然后继续下一个项目.
你可能也想看看PyKE.