我正在用Python编写日志收集/分析应用程序,我需要编写一个"规则引擎"来匹配日志消息并对其进行操作.
它需要具备以下功能:
我想象一个示例规则可能是这样的:
(message ~ "program\\[\d+\\]: message" and severity >= high) or (severity >= critical)
Run Code Online (Sandbox Code Playgroud)
我正在考虑使用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)
Run Code Online (Sandbox Code Playgroud)
然后,这些规则类将根据消息的分析树链接在一起,并在最高规则上调用match()方法,该方法将向下级联,直到评估完所有规则. …
我正在寻找一个用Java或Python编写的规则引擎,它支持以下功能:
已经排除了Drools(非常笨重,对非技术用户不友好).
到目前为止候选人是:
阅读Easy Rules不支持前向和后向链接,以及广度优先和深度优先搜索策略.
它只执行一次所有规则.
任何人都可以建议一个基于开源的规则引擎,用Java或Python编写?
感谢您抽时间阅读.
我正在寻找一个C或Python的规则引擎,但如果你知道用另一种语言实现的规则引擎,我会很高兴知道它.
引擎将用作自动化房屋的方式,例如当有人离开房间时关灯.所以那里没有"办公室"规则(也就是你在Excel中规则等).
我已经研究过Java中的Jess和Drools并且做得很好.我想知道其他人,并且可能使用比Java更少的内存.我在Python中听说过RuleCore,但实际上找不到任何文档(SourceForge上的版本1.0可用,但看起来它们正在销售v.2.0).
编辑:通过规则引擎(推理引擎),我的意思是RETE或等效的实现.
我正在寻求设计一个基本上需要根据输入做出决策的系统。输入将是一个人。
class Person:
def __init__(self, name, age, sex, weight, height, nationality):
self.name = name
self.age = age
self.sex = sex
self.weight = weight
self.height = height
self.nationality = nationality
Run Code Online (Sandbox Code Playgroud)
我们希望根据某些规则将每个人分配到一个学校班级。
例如:
22至25岁之间的英国女性应进入B级。75岁以上的男性应进入A级。6英尺以上的女性应进入C级。
我们将有大约400个不同的规则,并且应该应用第一个满足的规则-我们需要保持规则的顺序。
我正在考虑如何在此处存储/表示规则。显然,您可能只想发表一段很长的if, elif, elif声明,但这并不有效。另一种选择是将规则存储在数据库中,并可能在内存表中。
我希望能够在不发布规则的情况下编辑规则-可能具有前端,以允许非技术人员添加,删除和重新排序规则。
一切都在这里-唯一的要求是实际的编程语言必须是Python。
添加了更多内容
我想我的问题是如何存储规则。目前,这是一条很长的if elif elif语句,因此只要业务逻辑发生变化,PM都会制定新规则,然后将它们转换为if语句。
系统的所有输入将通过相同的规则列表发送,并且将应用匹配的第一个规则。多个规则可以应用于每个输入,但始终是第一个应用的规则。
例如
25岁以上的
女性去B级女性去A级。
即使第二条规则也适用,所有25岁以上的女性都将被送入B级。
输入将始终包含相同格式的输入-尚未确定它是对象还是字典的位置,但其中一些值可能是None。有些人可能没有与之相关的体重。