我在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过滤到用户不能无意间使用不希望的规则做一些疯狂的东西是很困难的。