Я пишу приложение для сбора/анализа журналов на Python, и мне нужно написать "механизм правил" для соответствия и действий в сообщениях журнала.
Для этого необходимо:
- Согласование регулярных выражений для самого сообщения
- Арифметические сравнения для серьезности сообщения/приоритета
- Булевы операторы
Я предполагаю, что примерное правило может быть примерно таким:
(message ~ "program\\[\d+\\]: message" and severity >= high) or (severity >= critical)
Я думаю об использовании PyParsing или аналогично анализу правил и построению дерева разбора.
Текущий (еще не реализованный) проект, который я имею в виду, состоит в том, чтобы иметь классы для каждого типа правила, а также строить и связывать их вместе в соответствии с деревом разбора. Тогда каждое правило будет иметь метод "match", который мог бы вернуть объект сообщения независимо от того, соответствует ли оно правилу.
Очень быстро, что-то вроде:
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 до такой степени, что пользователь не мог бы непреднамеренно сделать некоторые сумасшедшие вещи с правилами, которые не были предназначен.