Implémentation d'un "moteur de règles" en Python

Je suis en train d'écrire un journal de collecte et de l'analyse de l'application en Python et j'ai besoin d'écrire un "moteur de règles" pour correspondre et de la loi sur l'enregistrement des messages.

Il doit fonctionnalité:

  • Expression régulière correspondant pour le message lui-même
  • Comparaisons arithmétiques pour la gravité du message/priorité
  • Opérateurs booléens

J'ai la vision d'Un exemple, la règle serait probablement quelque chose comme:

(message ~ "program\\[\d+\\]: message" and severity >= high) or (severity >= critical)

Je suis en train de réfléchir à l'aide de PyParsing ou similaires à fait d'analyser les règles et construire l'arbre d'analyse.

Le courant (pas encore implémenté) conception que j'ai à l'esprit est d'avoir des classes pour chaque type de règle, et de la construction et de la chaîne d'ensemble selon l'arbre d'analyse. Ensuite, chaque règle aurait une "correspond à la" méthode qui pourrait prendre un objet de message de retour si oui ou non il correspond à la règle.

Très rapidement, quelque chose comme:

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)

Ces règle des classes serait alors enchaînés selon l'arbre d'analyse du message, et la méthode match() appelée sur le dessus de la règle, qui serait en cascade vers le bas jusqu'à ce que toutes les règles ont été évalués.

Je me demande simplement si cette approche est raisonnable, ou si mon design et idées sont totalement hors de contrôle? Malheureusement, je n'ai jamais eu la chance de prendre un compilateur cours de conception ou de quoi que ce soit en Université, donc je suis assez bien venir avec ce genre de choses de moi-même.

Quelqu'un pourrait-il avec une certaine expérience dans ces sortes de choses, s'il vous plaît carillon et d'évaluer l'idée?

EDIT:
Quelques bonnes réponses jusqu'à présent, voici un peu de précisions.

L'objectif du programme est de recueillir des messages de journal à partir de serveurs sur le réseau et de les stocker dans la base de données. Outre l'ensemble des messages de journal, le collecteur de définir un ensemble de règles qui vont correspondre ou ignorer les messages selon les conditions et le pavillon, un message d'alerte si nécessaire.

Je ne vois pas les règles en cours de plus d'une complexité moyenne, et ils seront appliqués dans une chaîne (list) jusqu'à ce qu'une correspondance d'alerte ou d'ignorer la règle est touché. Cependant, cette partie n'est pas tout à fait comme l'intérêt pour la question.

Autant la syntaxe étant proche de la syntaxe de Python, oui, c'est vrai, mais je pense qu'il serait difficile pour filtre Python, jusqu'au point où l'utilisateur ne pouvait pas, par inadvertance, faire un truc de dingue avec les règles qui n'était pas prévu.

source d'informationauteur Kamil Kisiel | 2009-01-22