Я замолчу сейчас. :-) Удачи!

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

Ответы на вопрос(5)

Ваш ответ на вопрос