我正在用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的编译器设计课程或其他任何类似的课程,所以我非常想自己想出这些东西。
有人在这些事情上有一些经验,请加入并评估这个想法?