21

EventSourceクラスを使用して ETW イベントを発行するように .NET 4.5 アプリケーションをインストルメント化しています。目標は、エラー ログ用にこれらのイベント (エラー レベル イベント) の一部をキャプチャできるようにすることです。

いくつかの読み取りとテストを行った後、エラーログへのこのアプローチの信頼性、特にイベントのドロップまたは欠落の可能性について懸念しています。エラー ログが機能しない場合は、アプリケーションをシャットダウンする必要があります (私の場合、報告されていないエラーで実行するのは安全ではありません)。ETW と を使用しEventSourceている場合、エラーが適切に記録されていることを確認するにはどうすればよいですか?

明らかに、答えの一部は、何がイベントをリッスンしているかによって異なります。私の場合、最新の MS Enterprise Library の「Semantic Logging Application Block」を使用する予定です。

以下は、Microsoft が見逃したイベントの考えられる原因について話しているソースの 1 つです。 イベント トレーシングについて

そこには、欠落イベントの考えられる原因がリストされています

  • イベントの合計サイズが 64K を超えています。これには、ETW ヘッダーとデータまたはペイロードが含まれます。イベントのサイズはアプリケーションによって設定されるため、ユーザーはこれらの欠落したイベントを制御することはできません。

  • ETW バッファー サイズが合計イベント サイズよりも小さい。イベントのサイズはイベントをログに記録するアプリケーションによって設定されるため、ユーザーはこれらの欠落したイベントを制御することはできません。

  • リアルタイム ログの場合、リアルタイム コンシューマーがイベントを十分に高速に消費していないか、完全に存在しないため、バッキング ファイルがいっぱいになります。これは、イベントがログに記録されているときにイベント ログ サービスが停止され、開始された場合に発生する可能性があります。ユーザーは、これらの欠落したイベントを制御できません。

  • ファイルにログを記録するとき、ディスクが遅すぎてログ速度に追いつけません。

これらの懸念が EventSource クラスを使用して何らかの方法で緩和されたかどうか (たとえば、大きなペイロードを何らかの方法で切り捨てるかどうか) を確認するために、いくつかのテストを行いました。長い文字列をログに記録しようとしましたが、30,000 から 35,000 文字の間で失敗しました (64KB の最大イベント ペイロードと一致しています)。大きすぎる文字列について私が知ることができることから、黙って何もしません。セマンティック ログのアプリケーション ブロック ログにイベントはまったくありません。前後の出来事はいつものように書かれています。

ペイロードに文字列があるときはいつでも、トランケータを介して渡す必要がありますか? 「速すぎる」イベントの生成を手動で回避する必要がありますか (また、それはどのように可能でしょうか)。

Microsoft のパターンとプラクティスは、私たちを適切なパターンとプラクティスに導くはずなので、ここで何かが欠けているだけかもしれません。

アップデート:

どうやら、「イベントが速すぎる」状態について、消費アプリケーションに何らかの通知があるようです。今日初めてこれを受け取りました:

レベル: 警告、メッセージ: トレース セッションでのバッファー オーバーランまたはスキーマ同期の遅延により、一部のイベントが失われます: Microsoft-SemanticLogging-Etw-svcRuntime

そして、セッションを閉じるとき:

レベル: 警告、メッセージ: トレース セッション 'Microsoft-SemanticLogging-Etw-svcRuntime' で 1 つのイベントの損失が検出されました。

アップデート2:

Enterprise Library Developers Guideでは、先ほど説明した動作について説明しています。

セマンティック ログ アプリケーション ブロックによって生成されたログ メッセージを監視して、バッファがオーバーフローしたことやメッセージが失われたことを示す兆候がないかどうかを確認する必要があります。たとえば、イベント ID 900 および 901 のログ メッセージは、シンクの内部バッファがオーバーフローしたことを示します。アウト プロセス シナリオでは、イベント ID 806 および 807 は、ETW バッファーがオーバーフローしたことを示します。シンクのバッファリング構成オプションを変更して、通常のワークロードでバッファがオーバーフローする可能性を減らすことができます。

エラーがドロップされた場合にアプリケーションが実行されないようにしながら、セマンティック ロギングを使用できますか? 通常のトレース イベントがドロップされる可能性があります ...

私の現在の考えでは、昔ながらのロギング手法を使用して別のクラスで「重大な」エラーをログに記録し、重大度の低いエラー (およびデバッグ タイプのイベント) は ETW パイプラインを通過するようにします。それはそれほど悪くはありません...より良い提案が見つからない場合は、解決策として投稿するかもしれません.

更新 3:

string私が受け取った「missing events」という警告は、バッファ オーバーランとは何の関係もありませんでした。これは、ペイロード値としてnull を渡した場合に表示されるメッセージであることがわかりました。

4

3 に答える 3

8

このEventSourceクラスには 2 つのバージョンがあり、1 つは .NET Framework に含まれており、もう 1 つは NuGet パッケージMicrosoft EventSource Libraryに含まれています。新しいコードが含まれているため、NuGet パッケージを使用していると思います。

基本クラスのコンストラクターには、次のドキュメント (NuGet パッケージ バージョン 1.0.26.0) でEventSourceブール値の引数を取るオーバーロードがあります。throwOnEventWriteErrors

デフォルトでは、「WriteEvent」メソッドを呼び出してもエラーはスローされません (イベントは黙って破棄されます)。これは、ほとんどの場合、ユーザーはロギングが「貴重」ではないと想定しており、ロギングの失敗によってプログラムがクラッシュすることを望んでいないためです。ただし、ロギングが「貴重」であり、呼び出し元が応答したい場合にロギングが失敗した場合、「throwOnEventWriteErrors」を設定すると、WriteEvent が失敗した場合に例外がスローされます。EventWrite が成功するという事実は、必ずしもイベントが宛先に到達したことを意味するわけではなく、書き込み操作が失敗しなかったということだけに注意してください。

残念ながら、最後の文には注意事項が含まれていますが、のソース コードを調べると、OS 呼び出しからの基本的な戻りコードが、および(およびその他のエラー) のEventSourceさまざまな例外をスローするために使用されていることがわかります。NoFreeBuffersEventTooBig

したがって、オンにすると、クラスが ETW にイベントを配信できないthrowOnEventWriteErrors場合に例外が発生します。EventSourceただし、ETW が別の理由で失敗した場合、例外は発生しませんが、ETW チャネルが正しく構成されていることを確認すれば、発生することはほとんどありません。ただし、エラー イベントが失われることは許容できないため、極端なエラー ケースをテストして、ETW が期待どおりに動作することを確認する必要があります。

于 2014-08-21T07:13:55.020 に答える
7

上記の議論で明確にされていない重要な点が 2 つあります。

  1. ドロップされたイベントに関連するすべての問題は、EventSource ではなく、ETW (Event Tracing for Windows) に関係しています。これは論理的には EventSOURCE が EventListeners と対話することであり、ETW に転送する組み込みのリスナーがあります。明らかに、ドロップされたイベントについて話すとき、チェーン内の ANY リンクの制約は、チェーンを流れるデータに影響します。したがって、完全な信頼性を保証する 1 つの方法は、ETW を使用せずにデータを送信したい場所に直接送信する EventListener を使用することです。(Semantic Logging Application Block) にはそのようなリスナーがあると思います。

  2. ETW はイベントを確実に転送するために使用されていますが、上記の制約内に収まる必要があります (イベントのサイズを 64K 未満に保ち、イベント レートを制御する必要があります。レートが高すぎると、WriteEvent が失敗するため、(一時停止後に) 再試行できるため、(プログラムの速度が低下するという犠牲を払って) 完全に信頼できるものを作成できるため、これがわかります。あなたが本当にエラーについて話しているのであれば興味深い問題です(これは大きな割合で発生するべきではありません。エラーが高速で発生している場合、それらは冗長である可能性があります(同じことが急速に発生します).

したがって、結論として、EventSource はデフォルトで信頼できるイベントをサポートします。ETW はデフォルトでサポートしていませんが、サポートするようにすることはできますが、多くの場合、ETW のデフォルトは問題ありません。

于 2016-03-21T16:42:00.103 に答える
-1

Semantic Log (MS Enterprise Library 6) http://msdn.microsoft.com/en-us/library/dn440729(v=pandp.60).aspxを参照してください。

イベント ソースを使用してリスナーを作成し、ログをイベント ビューアーまたはファイルまたはデータベースに記録する (またはカスタム ソリューションを作成する) ことができます。

更新: IoC シナリオでもイベント ID 806 / 807 をキャッチします。インターセプターには、私の EventSource クラスをインスタンス化するコードの一部がありました: 最初のインスタンスの参照を見逃すと、他のすべてのインスタンスがコンストラクターで失敗し、イベントの書き込み時にイベント ID 806 / 807 が発生します

ビッグデータのロギングには、メッセージ分割技術を適用できます

于 2014-01-17T10:30:22.077 に答える