2

イベントを検査し、特定の条件で新しいイベントのログを作成するアペンダー(または同様のもの)を作成したいと思います。

例としては、特定の量の同一のイベントがログに記録されるかどうかをチェックし、ログに記録される場合はより高いログレベルでイベントをログに記録するエスカレートアペンダーがあります。したがって、次のように定義できます。このロガーで10を超える同一の警告が発生した場合は、エラーにします。

だから私の質問は:

  1. このようなものはすでに存在しますか?

  2. Appenderは、この動作を実装するための適切なクラスですか?

  3. 気をつけるべき罠はありますか?

明確化:イベントを収集して分析するアルゴリズムは問題ありません。アペンダー内のコレクションでそれを行います。私の目的には永続性は必要ありません。私の質問2は、アペンダーはこれを行うのに適切な場所ですか?結局のところ、アペンダーのログエントリを作成することは通常の動作ではありません。

4

3 に答える 3

2

Appenderlog4j が提供するインターフェースを実装することで、独自のアペンダーを作成できます。

http://logging.apache.org/log4j/1.2/apidocs/org/apache/log4j/Appender.html

それも一つのアプローチでしょう。もう 1 つは、既存のアペンダーを使用して、ログを監視するコードを記述することです。たとえば、データベースにログを記録してから、データベース内のログ エントリを監視し、検出内容に基づいてメタ イベントを作成するプロセスを作成できます。

それは、あなたが何に慣れているかに大きく依存します。対処しなければならない 1 つの問題は、ログを振り返ってメタイベントを作成する方法です。アペンダーにイベントを蓄積するか、クエリを実行してメタイベントを作成できる場所に保持する必要があります。それらを蓄積する際の問題は、プロセスを停止して開始した場合、それらをどこかにダンプして元に戻すか、プロセスが再起動するたびに最初からやり直す必要があることです。

たとえば、 aNullPointerExceptionがスローされる 10 回ごとにログ エントリを作成するとします。ある種のデータベースにログ エントリがある場合、NPE がスローされるたびにクエリを実行して、最後にログ エントリを作成してから NPE がスローされた回数を確認します。1 つがスローされるたびにメモリ内でそれらをカウントすると、5 つがスローされた後にアプリケーションを再起動すると、その数を維持しないとカウントが失われます。

于 2009-07-30T17:02:34.703 に答える
1

Logback (log4j の後継) を使用すると、 TurboFiltersを介して任意のイベントのログを有効にできます。たとえば、同じイベントが特定の時間枠で N 回以上発生すると仮定すると、(そのレベルに関係なく) イベントを強制的に受け入れることができます。逆の処理を行うDuplicateMessageFilterも参照 してください(繰り返し発生するイベントを拒否します)。

ただし、logback でさえ、ロギング イベントのレベルを上げることはできません。Log4jもそうしません。どちらのフレームワークもこのように設計されていないため、その場で同じスレッド内でレベルをインクリメントしようとしないことをお勧めします。一方、後処理中にレベルをインクリメントすることは、まったく別の問題です。より高いレベルの新しいロギング イベントを生成するように別のスレッドにシグナルを送ることは、追加の可能性です。(ターボ フィルターが別のスレッドに信号を送って、より高いレベルの新しいログ イベントを生成します。)

あなたの質問からは、レベルを上げたい理由が明確ではありませんでした。レベルの増加自体が理由だったのか、それともレベルに関係なくイベントをログに記録するという目標への手段だったのか。後者の場合、logback の TurboFilters が最適です。

HTH、

于 2009-07-31T09:45:57.087 に答える
0

Rafeがすでに指摘しているように、最大​​の課題は、で実際のイベントを永続化するAppenderことです。これにより、イベントをトリガーする時期が来たことがわかります(ログレベルのエスカレーションなど)。

したがって、私は次の戦略を提案します。

  1. カスタムJDBCAppenderを使用します。Log4jにバンドルされているものとは異なり、これは例外をログに記録できます。
  2. HSQLDBなどの組み込みデータベースをセットアップし、イベントログ用に1つのテーブルを使用してデータベースをセットアップします。SQLを使用して発生したイベントの種類を見つけることができるため、永続性の問題が解決されます。
  3. データベースを監視し、目的のイベントパターンを検出する別のスレッドを実行します。
  4. LogManagerを使用して、目的のロガーにアクセスし、それらのレベルを手動で設定します。
于 2009-07-30T21:11:26.183 に答える