7

TickZoomは、独自の並列化ライブラリと複数のO / Sスレッドを使用して、マルチコアコンピューターをスムーズに利用できる非常に高性能なアプリです。

このアプリは、ユーザーが個別のO/SスレッドからLogAppenderに情報を書き込む必要があるというボトルネックにぶつかります。

FileAppenderはMinimalLock機能を使用して、各スレッドがファイルをロックして書き込み、次のスレッドが書き込むためにファイルを解放できるようにします。

MinimalLockが無効になると、log4netは、ファイルが別のプロセス(スレッド)によってすでにロックされているというエラーを報告します。

log4netがこれを行うためのより良い方法は、FileAppenderへの書き込みを処理する単一のスレッドを持ち、他のスレッドは単にメッセージをキューに追加することです。

このようにして、MinimalLockを無効にして、ロギングのパフォーマンスを大幅に向上させることができます。

さらに、アプリケーションはCPUを集中的に使用する作業を多く行うため、ファイルへの書き込みに別のスレッドを使用することでパフォーマンスが向上し、CPUがI/Oの完了を待機することがなくなります。

問題は、log4netがすでにこの機能を提供しているのかということです。もしそうなら、どのようにしてファイルへのスレッド書き込みを有効にしますか?おそらく、別のより高度なアペンダーはありますか?

そうでない場合は、log4netがすでにプラットフォームにラップされているため、TickZoomコードでこの目的のために別のスレッドとキューを実装することができます。

よろしくお願いいたします。ウェイン

編集:

おかげで、答えはおそらく何らかの方法でlog4netの拡張として独自のソリューションを開発することを示しているようです。そして、log4netがこの種のことを行わないことを明確に示しています。

さらに、重要なイベントの通知や情報のデバッグのために、主に人間が読めるメッセージを対象としたロギングシステムを「悪用」している可能性があることに気づきました。ソフトウェア出力のこの特定の部分は、システムの精度を検証する自動ツールにのみ実際に使用されます。

もちろん、デバッグや警告などの「通常の」方法でlog4netも使用します。

ただし、これらはデバッグログやユーザー通知ログというよりも「トランザクションログ」に似ています。具体的には、これらのログを直接人間が読める形式にする必要はありません。必要に応じて、ある種の「ビューア」がコンテンツをASCII形式で表示できます。

したがって、これらのトランザクションタイプのログを高速バイナリストレージに書き込むことを計画します。

おかげで、以下の両方の答えは、私たち自身のソリューションを開発するための素晴らしいナッジだったようです。

4

3 に答える 3

7

Log4netは、説明した正確なシナリオをサポートしていません。ただし、データベースアペンダーやUDPアペンダーなど、ロックされない他のアペンダーは提供されます。ここにいくつかのアイデアがあります:

  1. メッセージをメッセージキューに記録してから、リーダー(または複数のリーダー)にキューからメッセージを読み取らせ、ログに書き込みます。これにより、メッセージを送受信するための信頼できるメカニズムが提供されます。正直なところ、MSMQアペンダーがすでにあるかどうかはわかりませんが、自分で作成するのはそれほど難しくありません。

  2. UDPアペンダーを使用してメッセージを送信してから、これらのメッセージをリッスンしてファイルに書き込む独自のサービスを作成します。

ここでテーマを検出できると思います...基本的に、ノンブロッキングアペンダーの1つを使用して(または独自に作成して)、アペンダーからメッセージを受信して​​ファイルに書き込む独自のサービスを実装します。

于 2010-05-07T00:55:27.307 に答える
3

Object Guyのロガーをチェックして、非同期ロギングやその他の多くの機能を備えた高性能でマルチスレッドセーフなロガーを確認してください。非常に優れていると思います。http://www.theobjectguy.com/DotNetLog/。このページのマルチスレッドビデオを参照してください。

于 2010-06-28T08:11:05.353 に答える
1

ターゲットスレッドにI/Oを追加しないことが非常に望ましいため、ロギングコレクタースレッドにメッセージを送信することをお勧めします。また、ターゲットスレッドからSystem :: Diagnostics :: Debug :: WriteLineを使用して出力をダンプすることもありますが、とにかく内部に少しロックがかかるはずです。

もちろん、追加のロギングを追加すると「ハイゼンベルグ」効果が発生するため、高性能スレッドの有用なロギングを行うには、これらの効果が無視できる場合と無視できない場合を何らかの方法で知る必要があります。

少し凝ったものにしたい場合は、各スレッドに独自のメッセージリストを保存させ、何度も繰り返した後、どこかにダンプすることができます。したがって、データは、スレッドがログI / Oを実行する前の期間にのみ有用ですが、デバッグに十分な情報を取得できる可能性があります。また、分析のために個々のスレッドログを単一のログに照合するという楽しいタスクが得られます。

于 2010-05-07T01:32:12.720 に答える