3

「スケジューラー」の一部であるループを持つアプリケーションがあります。これは常に実行され、アプリケーションの中心です。ゲームループとほとんど同じですが、私のアプリケーションはWPFアプリケーションであり、ゲームではありません。当然、アプリケーションは多くのポイントでログを記録しますが、スケジューラーは機密性の高い監視を行います。ログだけでは、何が間違っているのか(間違って例外を意味するわけではありません)や現在のステータスを判断できない場合があります。

スケジューラの内部ループは短い間隔で実行されるため、そこでファイルI / Oベースのログ記録(またはイベントビューアの使用)を実行することはできません。まず、リアルタイムで監視する必要があります。次に、ログファイルのサイズが非常に速く大きくなります。そこで、このデータをリアルタイムでユーザーに表示する方法を考えていました。いくつか考えました。

  • UIにリアルタイムでデータを表示する
  • AllocConsole / WriteConsoleを使用して、この情報をコンソールに表示します
  • この情報を表示する別のコンソールアプリケーションを使用し、パイプまたは他のIPC技術を使用してスケジューラとコンソールアプリの間で通信します
  • Windowsのパフォーマンスモニターを使用して、どういうわけかこの情報をフィードします
  • ETW

UIでの表示には問題があります。まず、アプリケーション用に考えていたUIと統合されていないため、このためだけにUIを複雑にしたくありません。この診断はめったに行われません。次に、スケジューラには独自のスレッドがあるため、重要なデータ保護が行われます。

別のコンソールウィンドウがおそらく機能するでしょうが、それがあまりにも多くのしきい値ではないかどうか私はまだ心配しています。これはWindowsアプリであるため、自分のコンソールを割り当てることは、IPC通信やノンブロッキング通信について心配する必要がないため、別のコンソールアプリケーション(3)よりもおそらく優れています。ただし、ユーザーは私が割り当てたコンソールを閉じることができ、その場合は問題が発生します。別のプロセスを使用すると、それについて心配する必要はありません。

パフォーマンスモニター用のAPIがあると仮定すると、それは私のアプリとうまく統合されていないか、ユーザーにはわかりません。ETWを使用しても何も解決されません。ランダムなアイデアですが、この情報を何らかの方法で表示する必要があります。

他の人はどう思いますか、私が逃した他の方法はありますか?

4

2 に答える 2

9

敬意を表して-エイドリアンKとディマの両方の答えは正しくありません。正しい答えは、Windows用のイベントトレース(ETW)を使用することです。これは、Windowsでのすべてのロギングに使用するものです。その非常に堅牢で非常に優れたパフォーマンス。たとえば、W7は、プロセッサコンテキストスイッチを含む多くのOSイベントでETWイベントを常にログに記録します。W7でパフォーマンスモニターを使用したことがありますか?カーネルからETWイベントを消費しています。

すべてのロギングはETWで行うことをお勧めします。なんで?いくつかの理由:

  1. そのユビキタス
  2. 実行中のプロセスでログの無効化を有効にできます。プロセスを再起動する必要はありません。(はい、他のロガーはこれを行いますが、そうでないものもあります)。
  3. 配送コードに含めるように設計されています。
  4. イベントのログ記録は非ブロッキングであることが保証されています。「待機」は発生しません。
  5. ETWトレース処理用のツールを多数提供しています。特にXPERFツール(linklinklink

ETWイベントを使用してパフォーマンスパスをインストルメント化することの大きな利点は、XPERFツールを使用してイベントがカーネルイベントと統合されていることを確認できることです。

また、コンポーネントからETWイベントを監視する「監視」アプリケーションを作成するのも非常に簡単です。コンポーネントの1つに、イベントをコンソールに表示するだけの1つがあります。

独自の高性能ロギングシステムを作成しようとしないことを強くお勧めします。これをうまく行うのは困難ですが、パフォーマンスと信頼性の観点からです。Windows ETWシステムは非常に堅牢で、非常に優れたパフォーマンスを発揮します。

于 2010-04-24T16:29:58.003 に答える
0

基本に戻る-別の懸念。

私の通常の解決策は、MicrosoftEnterpriseLibrariesを使用して実際のログを処理することです。データベースをリポジトリとして使用します。その後、任意のアプリケーション(既存のアプリケーションまたは完全にスタンドアロンのもの)から自由にクエリを実行できます。

MS Ent Libsについて私が気に入っているのは、さまざまな種類のリポジトリにログを記録するように構成できることです。必要に応じて、それらを拡張できます。パフォーマンス/実行の制約のために非同期で作業するかどうかはわかりません。

私はDBにログを記録することを好みます。それは、優れたレベルの制御を提供するからです。クエリが簡単で、データを操作するのもかなり簡単です。Ent Libsがローリングファイルベースのログ記録を許可していることを確認すると(ファイルサイズの管理に役立ちます)、Dbを使用するとファイルを読み取るよりも高速になります。

dbへのロギングが十分に高速であるかどうかについては、「リアルタイム」の意味に帰着すると思います。-コンピュータへのリアルタイムは、人へのリアルタイムとは大きく異なります。

メモリにログを記録してから、それらのログエントリを非同期的に繰り返し、ログタームストレージ(DB)にコミットすることができます。レポートについては、メモリ内のコピーを使用して「現在の」状態を表示し、より遠い過去の長期間のDBを参照することができます。

于 2010-04-19T04:40:16.593 に答える