6

私は、パフォーマンスが非常に重要な金融取引のために、複数のクライアントとサーバーがソケットベースの通信に取り組んでいるクライアントサーバーアプリケーションで作業しています。現在、system.IO名前空間のstreamwriterを使用してログをファイルに書き込んでいます。単一のトランザクションの場合、異なる値をログに記録するためにstreamwriterメソッドを50回呼び出す必要があり、50,000を超えるトランザクションの場合、このログにかかる​​時間が非常に重要になります。

アプリケーションがロギングを行うのにかかる時間を短縮するにはどうすればよいですか?ストリームライターの代わりに他のアプローチまたは他のクラスを選択する必要があるかどうか?より短い時間でロギングを行うための最良の方法は何でしょうか。

4

6 に答える 6

7

パフォーマンスが重要な場合は、Event Tracing for Windows (別名 ETW) を検討することを検討します。

.NET 4.5 とEventSourceクラスの導入により、ETW は以前よりもはるかに簡単に実装できるようになりました。

Vance Morrison の Weblogには、このトピックに関する優れた記事がいくつかあります。

アーキテクチャの概要については、「ETW を使用してデバッグとパフォーマンス チューニングを改善する」を参照してください。

EventSource 機能の組み込みとロギング動作の管理を容易にする Microsoft のパターン & プラクティス チームのセマンティック アプリケーション ブロックもあります。

于 2013-01-23T05:34:14.470 に答える
1

Log4Net を試すことをお勧めします。場所 (ファイル、データベース、xml) と時間 (バス、トランザクションなど) を構成し、トレース レベル (デバッグ、情報、警告など) を簡単に切り替えることができます。

ログシステムをゼロから作成する価値はありません。

于 2013-01-22T11:40:09.223 に答える
0

ロギングにかかる​​時間を短縮するには、次のことをお勧めします。

  • ログに記録されるデータに最小限の変換/フォーマットが必要であることを確認してください
  • 次のようなロギング ライブラリを作成または使用します。
    • 呼び出されると、ロギング データ (時間、スレッド ID、およびログに記録されるその他のタグと共に) をバッファーに入れます。
    • バッファリングされたデータを定期的にディスクにフラッシュします (つまり、バッファリングされたデータがログ ファイル内の少なくとも 1 つの物理ブロックを埋めるのに十分な大きさになったとき、またはシステムがアイドル状態になったとき、または x 秒ごとに定期的に)。
    • 排他的な書き込みアクセスのためにログ ファイルをロックします。ソフトウェアの実行中にログ ファイルを表示できますが、他のプロセスがログ ファイルをロックすることはできません。
    • 別のスレッドを使用してフラッシュを処理します。つまり、ワーカー スレッドを遅くしません。
  • 多くのサーバー プロセスがある場合は、IPC を使用してログ データを 1 点に送信し、書き込まれるアクティブなファイルの数と使用中のバッファーの数を最小限に抑えることを検討してください (テストが必要になる場合があるため、これが価値があるかどうかを確認し、各エントリのソースを表示するためにタグを追加する必要がある場合があります)。
  • ログが大きくなりすぎないように、ログの定期バックアップまたはアイドル タイム バックアップを実行します。
于 2013-01-22T11:43:40.193 に答える
0

データベースにログインすることをお勧めします(高パフォーマンス、おそらく埋め込まれたsqlite / sqlce)。ボーナス - ログ エントリを構造化し、クエリを実行できます。

于 2013-01-22T11:03:13.003 に答える
0

値をディスクに書き込む前にキャッシュします。

トランザクションが完了したときにのみ、ログをコミットしてください。

このようなもの:

StringBuilder builder = new StringBuilder();
// do transaction step 1
builder.Append("Transaction step 1" + environment.NewLine); // or however you add a line to you log

// step 2
builder.Append("Transaction step 2" + environment.NewLine);

//...

// step 50
builder.Append("Transaction step 50" + environment.NewLine);

// now write to the file
File.WriteAllText(@"C:\log.txt", builder.ToString());

いずれかのステップでエラーが発生した場合は、何らかの処理を追加して、引き続きログを書き込むことができます。

log4net のようなオープンソース ツールを使用することもできます: http://logging.apache.org/log4net/

于 2013-01-22T11:00:57.883 に答える
0

アプリケーションのパフォーマンスを向上させ、これらすべてのログ メッセージを書き出せるようにする 1 つの方法は、それらのログ メッセージを MSMQ キューにキューに入れ、サーバーに負荷がかかっていないときにキューに入れられたログ メッセージを Windows サービス アプリケーションで処理することです。完全に別のサーバーにキューを配置することもできます。

実装に関しては、MSMQ を使用してログ メッセージを処理する WCF Web サービスをセットアップできます。これにより、Windows サービスをセットアップするよりも簡単になります。

于 2013-02-15T05:51:25.477 に答える