2015-11-12 27 views
5

私はJavaとlog4j2の新機能を使用しています。私の問題は次のとおりです。ロギングにlog4j2を使用するアプリケーションを作成しました。プログラムはデータを分析し、与えられた文字列を必要に応じて解析できない場合に警告を出力します。時にはプログラムが予期しない文字列を多く取得し、同じエラーメッセージが常に記録されることがあります。ですから、同じエラーメッセージを何度も繰り返し記録することを避けるにはどうしたらよいでしょうか。たとえば、同じエラーメッセージをログファイルに2000回表示する代わりに、このエラーメッセージがx回書き込まれたというヒントをログファイルに書きたいと思います。私の現在のlog4j2設定ファイルを見て、次のように:log4j2の重複メッセージを抑制する方法

<?xml version="1.0" encoding="UTF-8"?> 
<Configuration> 
    <Properties> 
     <Property name="pattern">%d{DEFAULT} %-5p %-18.18c %4.4L [%-15.15t] %m%n</Property> 
    </Properties> 

    <Appenders> 
     <Console name="STDERR" target="SYSTEM_ERR"> 
      <PatternLayout pattern="${pattern}" /> 
     </Console> 
    </Appenders> 
    <Loggers> 
     <Root level="warn"> 
      <AppenderRef ref="STDERR" /> 
     </Root> 
    </Loggers> 
</Configuration> 

答えて

0

私は悲しげに、現在、私のコードを持っていないが、これは、あなたがこの問題を解決することができます(と非常によく、すでにそこに解決策があるかもしれない)方法です。

ファイル/コンソールに非同期でログを記録する新しいアペンダーを作成できます。

アペンダーでは、アグリゲーションを自分で実装することができます。 logeventが来たら、直ちにそれを書き出すのではなく、前にそのメッセージを見たことがあるかどうかを確認してください。そうした場合は、ログに記録する代わりにカウンターを増やしてください。

最終的には、これらの集約されたログイベントを集約されたメッセージに変換し、千のログイベントではなくそのイベントを処理します。

これは、(たとえば)非同期アペンダーベースの2番目のワーカーで解決できます。通常は(私はロックバックを見ていますが、それはかなり似ていると仮定します)、非同期アペンダーは、キューにイベントを追加してしまい、そのキューから機能する別のスレッドによって処理されます。

集約されたメッセージには別のキューを設定し、実行するワーカーには5秒ごとにメッセージを送信できます。 5秒間に同じメッセージが複数回表示された場合、ワーカーはそのメッセージを集約して処理するキューに入れて、最終的にログに記録されます。

私はあなたの設定に関してP.S:

アルトゥル

、それが役に立てば幸い、単にあなたのカスタム集計アペンダをコンソールアペンダを交換してください。コンソールが必要な場合は、単にアペンダーを拡張して、それがあなたがしたいことをやり遂げるようにしてください:)

+0

実はそれはむしろ、あなたの実際のAppenderに委譲するジェネリックAppenderWrapperを持ってしても意味があります。したがって、コンソールアペンダがもう気に入らなければ、簡単にアペンダを簡単に切り替えることができます。 – philnate

+0

フィルターを使用して同じことを達成できます。フィルタには、イベントと一致する数多くのパターンを指定できます。フィルタがパターンに一致すると、フィルタはメモリ内の記憶領域に格納され、イベントの伝搬が停止します。メモリ内ストレージBeanは、ワーカーに単純な古いログを使用して集約をログに記録させることができます(シャットダウン時に必ず書き出すようにしてください)。そうすれば、単にすべてのアグリゲーターを再利用してフィルターに作業を任せることができます。 – pandaadb

0

これを行うlog4j2プラグインを作成することはもちろん可能ですが、私はロギングライブラリーが最良ではないと主張しますこれに対処する場所。

あなたのアプリケーションでは、以前に記録したメッセージを記録しておくと、もっと簡単なコードになります。次のメッセージが同じ場合は、ログを記録せずにカウンタをインクリメントします。別のメッセージをヒットすると、カウンタ値が記録されます。

(これは、複数のメッセージを追跡するためにデキューして、より一般的な行うことができます。)

関連する問題