Python でログ収集/分析アプリケーションを作成しています。ログ メッセージを照合して処理する「ルール エンジン」を作成する必要があります。
次の機能が必要です。
- メッセージ自体の正規表現マッチング
- メッセージの重大度/優先度の算術比較
- ブール演算子
ルールの例はおそらく次のようなものになると思います。
(message ~ "program\\[\d+\\]: message" and severity >= high) or (severity >= critical)
PyParsingなどを使用して実際にルールを解析し、解析ツリーを構築することを考えています。
私が考えている現在の (まだ実装されていない) 設計は、ルールの種類ごとにクラスを持ち、解析ツリーに従ってそれらを構築し、連鎖させることです。次に、各ルールには、ルールに一致するかどうかに関係なくメッセージ オブジェクトを返す「matches」メソッドがあります。
非常に迅速に、次のようになります。
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() メソッドが呼び出され、すべてのルールが評価されるまでカスケードされます。
これが合理的なアプローチなのか、それとも私のデザインやアイデアがまったくおかしくないのか疑問に思っています。残念ながら、私は大学でコンパイラ設計コースなどを受講する機会がなかったので、ほとんど自分の意思でこのようなことを考えています。
この種のことについてある程度の経験をお持ちの方は、アイデアを評価していただけませんか?
編集: これまでのところ、いくつかの良い答えがあります。ここで少し説明します。
このプログラムの目的は、ネットワーク上のサーバーからログ メッセージを収集し、データベースに保存することです。ログ メッセージの収集とは別に、コレクターは、条件に応じてメッセージを一致または無視し、必要に応じてアラートにフラグを立てる一連のルールを定義します。
中程度の複雑さを超えるルールは見当たりません。一致するアラートまたは無視ルールがヒットするまで、チェーン (リスト) に適用されます。ただし、この部分は質問とはあまり関係ありません。
構文が Python 構文に近い限り、それは本当ですが、ユーザーが意図しないルールでクレイジーなことをうっかり実行できなくなるまで Python をフィルタリングするのは難しいと思います。