web-dev-qa-db-ja.com

SLF4J / Logbackでマーカーを使用するためのベストプラクティス

しばらくプロジェクトでSLF4JとLogbackの組み合わせを使用しており、非常に満足していますが、ロギング戦略は非常にシンプルで、クラスベースのロガーを使用し、MDCやMarkersなどの派手なものは使用していません。

私が知りたいのは、コミュニティの誰かが実際にこれらの機能を使用しているか、ロギング/フィルタリングを改善するためにどのように使用されているかです。

私は、どこで、なぜ、どのように使用するかに特に興味があります[1] ロギング用のマーカー。それらはセマンティックコンテキストをロギングに追加するための非常にきちんとした機能として私を打つ-例えば。クラスが複数の懸念事項を処理している間、タスク/懸念事項固有のマーカーを使用してログステートメントを区別することができます。

ロギングでマーカーを作成および使用するためのベストプラクティス、規則、または戦略とは何ですか。

更新:私が推測しているのは、私が本当に望んでいるのはマーカーではなくwhyではなくhowpart —マーカーに名前を付けるいくつかの良い習慣があります(たとえば、スペースまたはダッシュ/アンダースコア/句読点で区切られたキーワードスタイル名を持つプレーンテキストを使用) 「標準名」のプール、ビジネス機能に基づいたものの命名。おそらく自分で理解できる質問ですが、これらの機能を体系的に使用して開発者のチームに紹介したい場合は、いくつかの正式なガイドラインを設定するのが理にかなっています...


[1] -useマーカーの使用方法を尋ねることにより、APIの使用方法を実際に求めているわけではありません(実際には非常に簡単です)-むしろ、マーカーを一貫して使用してログを設定する一般的なレベル

114
Roland Tepp

まず、@ dariooが言ったように:

  • MDCは、「エンティティ」がほとんどない複数のイベントを関連付けるために使用されます
  • [マーカー]は、通常のイベントからフィルタリングしたい「特別な」イベントに使用されます

そのため、MDCを使用したいというあなたの主張。マーカーは、「スライス」ではなく、「特別な」イベントを強調表示するためのもので、必要に応じてフィルタリングします。たとえば、特定のユーザーに基づいてスライスするが、予期しない例外に基づいてフィルターをかけることができます。この場合、UserMDCディメンションとUnexpectedExceptionを作成しますマーカー。


しかし、これはあなたが念頭に置いていた質問に対処していないようです。 「むしろ、マーカーを一貫して使用してログを設定する方法のより一般的なレベルを参照している」。それで対処しましょう:

MDCはスライシングとダイシング用で、マーカーはfiltering用です。 これらのアクティビティはテスト中および本番環境で実行されます。そのため、テスト/運用が開始されたときに、ログデータをスライスするのに役立つと予想されるディメンション、およびフィルタリングするのに役立つケースを決定する必要があります。 各ディメンションはMDCディメンションを取得します。各ケースはマーカーを取得します。それはそれと同じくらい簡単です。

開発者はここで決定を行う必要はありません。単一の個人またはチームが設計時に決定する必要があります設計時に、何をある種のスライス、ダイシング、フィルタリングをサポートする必要があります。これは、実行するように求められる可能性のある分析タスクの種類を想像することによって通知する必要があります。

この同じ人またはチームが命名規則を決定する必要があります。 それは完全に任意です。美的に満足できるもの、自己記述的(最も重要)、そして後の追加と競合する可能性が十分にない具体的なものを選択してください。ハイフンvs。アンダースコアは非常にきちんとしていて、ポイントの横に驚くほどありますが、ESL従業員がアンダースコアを読むことの混乱が少なくなるかもしれないことに注意してください(少なくともCamelCaseと比較して) );同時に、これは、必要なキーに到達するのが面倒であるために、一部の開発者を困らせていると伝えられています。

ポリシーを決定する限り、これは単に特定のマーカーまたはMDCディメンションを採用する必要がある場合の定義を意味します。これを厳重に(集中、意図的に)保ちますが、寸法とマーカーのセットが手近なタスクに対して不十分であると感じた場合、開発者からのフィードバックを考慮してください。必要に応じて、ディメンションや属性を修正/追加します。

このポリシーはほぼ必ずプロジェクト固有のものですを理解してください。すべてのプロジェクトが同じ種類のログ分析を必要とするわけではありません。いくつかの悪夢のシナリオを想像してください。次に、そのシナリオでログを分析する方法を想像してください。おそらく、どのメッセージがどのコンテキストに属し、どの状態がどの時点にどのメッセージであるかを試して追跡するための複雑なスクリプトを記述する必要はないでしょうか?寸法やマーカーとして必要な情報はすべてエンコードし、問題が発生した場合の手間を省きます。

89
user359996

まず、MDC。

MDCは、何らかの動作に関連付けられた1つの「エンティティ」がある環境で本当に役立ちます。典型的な例:Webアプリケーションと対話するユーザー。したがって、多くのユーザーがWebアプリをいじっているとしましょう。 MDCを使用すると、あまり手間をかけずに簡単に追跡できます。簡単な例:

...[Sandy][abcd] clicked on "change profile"
...[Joe][1234] clicked on "weather reports"
...[Joe][1234] clicked on "Europe"
...[Sandy][abcd] clicked on "logout"
...[Joe][1234] clicked on "logout"
...[Sandy][efgh] logged in

ここでは、ユーザー名とセッションIDの2つの場所でMDCを使用しています。このようにして、1人のユーザーのセッションを簡単にgrepして、ユーザーが行っているすべてのことを確認できます。

第二に、マーカー。

マーカーは通常、深刻な重大なエラーについて管理者にメールを送信するなど、「特別な」状況で使用されます。すべてのエラーが常に同じカテゴリに分類されるわけではありません。いくつかは適切な方法で対処する必要があります。

または、ユーザーがサービスを終了すると、通常はINFOログに移動しますが、このようなイベントを別のログファイルに記録したい場合は、そのようなインスタンスにマーカーを使用して監視することもできます終了するユーザーの統計収集のためにより簡単に。

経験則:

  • MDCは、「エンティティ」がほとんどない複数のイベントを関連付けるために使用されます
  • マーカーは、通常のイベントからフィルタリングしたい「特別な」イベントに使用されます
67
darioo

マーカーを使用して、colorまたはsinglelogステートメントをマークできます。これらの色、つまりマーカーで何をするかはあなた次第です。ただし、マーカーの使用に関しては、2つのパターンが一般的(最初のパターンは2番目のパターンよりも一般的)のようです。

  1. トリガー:特定のマーカーの存在下でアクションを実行するようにアペンダーに指示することができます。たとえば、SMTPAppenderは、ログレベルに関係なく、NOTIFY_ADMINマーカーでログイベントにマークが付けられるたびに電子メールを送信するように構成できます。 logbackドキュメントの マーカーベースのトリガー を参照してください。ログレベルとトリガーのマーカーを組み合わせることもできます。

  2. フィルタリング:たとえば、「DB」という色で永続性関連のログ(さまざまな複数のクラスファイル)をすべて色付け/マーク付けできます。その後、「DB」でフィルタリングできます。DBでマークされたログステートメントを除き、ロギングを無効にします。詳細については、logbackドキュメントの フィルターの章 を参照してください(MarkerFilterを検索)。

29
Ceki

補足として、logstashを使用していて、jsonロギングを有効にしている場合、Markerの別の潜在的な用途があります-変​​数をロギングして特定のログメッセージに関連付けるためです。これは、メッセージ本文に含めるよりも一貫性があり、解析が容易です。ユースケースに適している場合、非常に便利です。

詳細はこちらをご覧ください:

https://github.com/logstash/logstash-logback-encoder#loggingevent_custom_event

7
Mark D