Я замолчу сейчас. :-) Удачи!
у приложение для сбора / анализа журналов на 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 до такой степени, что пользователь не сможет непреднамеренно сделать что-то сумасшедшее с правилами, которые не предназначены.