Я пишу приложение для сбора / анализа журналов на 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, поэтому я в значительной степени придумываю этот материал по собственному желанию.
Может ли кто-нибудь, имеющий некоторый опыт в подобных вещах, пожалуйста, присоединиться и оценить идею?
EDIT:
Пока есть несколько хороших ответов, вот немного пояснений.
Целью программы является сбор сообщений журнала с серверов в сети и сохранение их в базе данных. Помимо сбора сообщений журнала, сборщик определит набор правил, которые будут либо совпадать, либо игнорировать сообщения в зависимости от условий, и при необходимости пометить предупреждение.
Я не вижу, чтобы правила были более чем средней сложности, и они будут применяться в цепочке (списке) до тех пор, пока не будет достигнуто соответствующее предупреждение или правило игнорирования. Однако эта часть не так актуальна для вопроса.
Что касается синтаксиса, близкого к синтаксису Python, то да, это правда, однако я думаю, что будет трудно отфильтровать Python до такой степени, что пользователь не сможет непреднамеренно сделать что-то сумасшедшее с правилами, которых не было предназначенный.