23

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 をフィルタリングするのは難しいと思います。

4

5 に答える 5

67

さらに別のルール言語を発明しないでください。

Python を使用するか、BPEL のような既存の既にデバッグ済みで動作する言語を使用してください。

ルールを Python で記述し、インポートして実行するだけです。生活はよりシンプルになり、デバッグもはるかに容易になり、別の問題を引き起こすことなく、実際のログ読み取りの問題を実際に解決できました。

このシナリオを想像してみてください。プログラムが壊れます。これは、ルールの解析、ルールの実行、またはルール自体のいずれかです。3 つすべてをデバッグする必要があります。Python でルールを記述した場合、それがルールになり、それがそれになります。

「ユーザーが意図しないルールでクレイジーなことをうっかり実行できなくなるまで、Python をフィルタリングするのは難しいと思います。」

これは主に「コンパイラを書きたい」という議論です。

1) あなたがプライマリ ユーザーです。ルールを作成、デバッグ、保守します。クレイジーなことをするクレイジーなプログラマーの軍隊が本当にいるのでしょうか? 本当に?気が狂っている可能性のあるユーザーがいる場合は、彼らと話してください。それらを教えます。新しい言語を発明して彼らと戦わないでください (その言語は永久に維持し、デバッグする必要があります)。

2) 単なるログ処理です。狂気への本当の代償はありません。丸太の取り扱いに誤りがあり、世界経済システムを覆す人は誰もいません。いくつかのルール言語の数十行を解釈するために、1000 行のインタープリターに数十行の Python で小さなタスクを作成しないでください。数十行の Python を書くだけです。

できるだけ早く明確に Python で記述して、次のプロジェクトに進みます。

于 2009-01-22T11:22:15.387 に答える
5

PyKEもご覧ください。

于 2009-12-18T01:07:25.163 に答える
0

アプリケーションの範囲がわからないと、質問に答えるのは少し難しいです。

  • あなたは何について推論しようとしていますか?
  • どのレベルの分析について話しているのですか?
  • ルールがどれほど複雑になっていると思いますか?
  • 異なるルール間の相互作用はどれほど複雑ですか?

スペクトルの一端には、あなたが提案したような単純な 1 回限りのアプローチがあります。ルールが少なく、比較的単純で、指定されたルールに一致するログ メッセージを集約するよりも複雑なことをしていない場合は、これで問題ありません。

スペクトルの反対側には、 Python インターフェイスを備えたCLIPSのような重い推論システムがあります。これは、推論を備えた実際のルール エンジンであり、洗練された推論を行う機能を提供します。プログラムログから動作する診断エンジンのようなものを構築している場合は、これがより適切になる可能性があります。

編集:

現在の実装のアイデアは、あなたがやっていることには問題ないと思います。それ以上のものは、おそらくソリューションを過剰に設計するリスクがあると思います. いくつかの異なる基準に基づいてログメッセージを照合し、必要なものをキャプチャしているようです。

于 2009-01-22T02:56:07.360 に答える
0

Python構文自体と違うところはそのmessage ~ "program\\[\d+\\]: message"部分だけなので、本当に新しい構文が必要なのかなと。

更新: OK、ユーザビリティまたは安全性に関する懸念があります - それは妥当です。いくつかの提案:

  • Awk からヒントを得て、パターン マッチング構文を簡素化し/program\[\d+\]: message/ますmessage ~ "program\\[\d+\\]: message"

  • 評価するオブジェクトのツリーを構築するのではなく、入力が解析されるときに Python 式に変換することで実装します。ただし、評価よりも多くの操作を行うことが予想される場合を除きます。これにより、必要なコードが少なくなり、実行が速くなります。トップレベルは次のようになります。

    def compile(input):
        return eval('lambda message, severity: %s' % parse(input))
    

さらに別のアイデアとして、Lua でアプリを作成します。プログラマーでなくても、多くを学ばなくても安全にプログラムを拡張できるように設計されています。(そのようにうまく使用されており、評価をサンドボックス化できるため、明示的に渡さない機能をユーザーのコードが取得できないようになっています。)

もう黙ります。:-) 幸運を!

于 2009-01-22T01:20:11.563 に答える