4

エラーが発生するまでログステートメントを内部的に保持する新しいロガーを作成するというアイデアを検討しています。

したがって、私が取り組んでいるシステムでは、これはシーケンス プロセスです (並行作業ではなく、開始点と終了点が設定されています)。info() 行をメモリにバッファリングし、最後にエラーが発生した場合はそれらをフラッシュするか、成功した場合はそれらをログに記録しないようにしたいと思います。

メモリの使用についてはあまり心配していません。一度に 15 行しかありません (複数のクラスにまたがって)。ただし、1 秒間に数百のアイテムを処理できるため (それぞれが 15 行を作成)、ログは必要のないデータで冗長になる可能性があります。

もう 1 つのオプションは、1 つのメイン ファイルにログを記録することです。エラーが発生した場合は、最後のバッファを ERROR ログにフラッシュします。

自分で作成する前に、これを行う SLF4J-LogWriter または LOG4J-Appender を知っている人はいますか?

http://sling.apache.org (org.apache.sling.scripting.core.impl.LogWriter) が既に同様のことを行っていることがわかりますが、おそらくコードをハックする必要があるでしょう。

ありがとうジェフ・ポーター

4

1 に答える 1

3

log4j と logback についても同じことを行いました。私の知る限り、既製のソリューションはありません。

さらなる有用性のために、私の実装はすべてのレベルでログ メッセージをバッファリングし、レベルごとに保持するメッセージの数を構成できます。

ERROR がログに記録されると、すべてのメッセージを順番にダンプします。

いくつかのコメント:

  • レベルごとに 1 つのバッファーを作成します。これにより、レベルごとに N 個のメッセージを保持することが非常に簡単になります (N はレベルに依存します。通常、INFO メッセージよりも多くの DEBUG メッセージが必要です)。
  • 各メッセージに一意の ID を付与するには、AtomicIntegerまたはが必要です。AtomicLong後で、異なるバッファーから順番に並べ替えるために必要になります。
  • ルート ロガー レベル以下のメッセージはアペンダーに表示されないため、DEBUG しきい値を指定してルート ロガーを実行する必要があります。
  • 他のすべてのアペンダーにしきい値フィルターを構成する必要があります。
  • ほとんどの操作はメモリ内で行われるため (ログ メッセージはほとんどディスクに書き込まれません)、実際には思ったほど悪くはありません。
  • これは、log4j よりもlogbackで実装する方がはるかに簡単です。
于 2012-11-12T14:55:38.420 に答える