3

ログ レベル (TRACE、DEBUG、INFO、WARN、ERROR、FATAL) に関する現在のログのしきい値では十分ではありません。緊急時に、サードパーティのライブラリから ERROR カテゴリに書き込まれたギガバイトのログがあります。この問題のログを見たいので、このログをオフにしたくありません。ほとんどのログは継続的にスタック トレースを繰り返しています。だから私は一種のアペンダーが欲しい

  • 1) しきい値 (kb/秒) に達した場合はログをスキップします (つまり、多くのログに書き込んでいる場合 - 一部をスキップする可能性があります)。
  • 2) 一定期間に複数のスタックトレースが出力された場合、スタックトレースの出力をスキップします

提案してください

4

2 に答える 2

2

Log4j には、そのままではそのようなアペンダーがありません。ただし、次のことを行うことができます。

ギガバイトのデータを使用するサード パーティ ライブラリのアペンダーを追加します (「サード パーティ ライブラリからエラー カテゴリに書き込まれたギガバイトのログがあります」)。また、アペンダーがそのような大量のストレージを使用しないように構成します。

  1. RollingFileAppender このサード パーティ ライブラリ アペンダーをローリング ファイルとして構成します。しばらくすると、最も古いファイルが使用されるようになり、最新のログのみを保持できます。

  2. JDBCAppender このアペンダーは、ストアド プロシージャの使用を受け入れます。必要な処理が実行されるストアド プロシージャを記述します。

最初の要件では、計算された列を追加するか、ストアド プロシージャでこの値を計算して、テーブルの列に追加します。次に、この値を制御して、このログ行をデータベースに挿入する必要があるかどうかを決定します。

2 番目の要件では、例外メッセージのハッシュ値 (MD5、SHA など) を取得できます。このハッシュ値がデータベース テーブルに存在する場合は、無視して挿入できます。または、存在する数を数えて、それに応じてデータベースに挿入する方法を決定することもできます。

これらの目的でエンタープライズ データベースを使用する必要はありません。たとえば、apache derby を使用すると、すべてのログがアプリケーション サーバーに残ります。この JDBCAppender は、要件をより厳密に満たしていると思います。

于 2013-11-13T20:11:12.300 に答える
1

私は過去に似たようなことを書いたことがあります (Y 時間ごとに最大 X メールを送信します)。方向性を教えてくれます。セッターは必須ではありませんが、 を介してデフォルトを変更できますlog4j.properties

public class LimitedSMTPAppender extends SMTPAppender {

    private int limit = 10;           // max at 10 mails ...
    private int cycleSeconds = 3600;  // ... per hour

    public void setLimit(int limit) {
        this.limit = limit;
    }

    public void setCycleSeconds(int cycleSeconds) {
        this.cycleSeconds = cycleSeconds;
    }

    private int lastVisited;
    private long lastCycle;

    protected boolean checkEntryConditions() {
        final long now = System.currentTimeMillis();
        final long thisCycle =  now - (now % (1000L*cycleSeconds));
        if (lastCycle!=thisCycle) {
            lastCycle = thisCycle;
            lastVisited = 0;
        }
        lastVisited++;
        return super.checkEntryConditions() && lastVisited<=limit;
    }

}
于 2013-11-17T08:03:13.837 に答える