Log4Netと並列インスタンスからのログ
-
06-07-2019 - |
質問
プロジェクトでlog4netを使用していますが、1つの問題があります。 プログラムの主要な機能には長い時間がかかり、ログを使用してその情報を保存します。ログをファイルに保存するために FileAppender を使用します。
私のアプリケーションは共有(ローカル)フォルダーにあり、1つのパスから実行されているアプリケーションのインスタンスが複数存在する可能性があります。この場合、最初のプログラムからのみ情報を記録できましたが、アプリケーションの他のインスタンスは、ログファイルがロックされているために情報を記録できませんでした。
" log4net.Appender.FileAppender + MinimalLock" オプションを使用すると、情報が失われる場合があります。両方のインスタンスのすべてのログがファイルに保存されるわけではありません。
この問題を解決し、並列インスタンスからの情報を記録するにはどうすればよいですか?また、「MinimalLock」を使用した場合のパフォーマンスの低下についてはどうですか。オプション?
ありがとう。ご協力をお願いします。
解決
ログファイル名にアプリケーションのプロセスIDを含めるだけです。アプリの異なるインスタンスは、異なるファイルにログを記録します。次に例を示します。
<appender name="MyRollingFileAppender" type="log4net.Appender.RollingFileAppender">
<file type="log4net.Util.PatternString">
<conversionPattern value="log_%processid.log" />
</file>
<!-- ... -->
他のヒント
これは、集中ログソリューションが望ましい典型的な状況だと思います。ファイルを心配してパフォーマンスのボトルネックに悩まされる代わりに、ログの保存と処理を処理するリモートサービスにログステートメントを非同期的に送りたいと思います。 logFaces と呼ばれるこのログアグリゲーターをご覧ください。ログ。標準のlog4net UDPアペンダーで動作し、アプリケーション、ホスト、スレッドなどごとにログデータを分割します。本当に必要なときにいつでもログファイルを作成できます。
開示:私はこの製品の著者です。
おそらく、各インスタンスから異なるファイルにログを記録しますか?それ以外の場合は、おそらくロギング専用の別のプロセスをセットアップする必要があります。プログラムの各インスタンスはそこにログメッセージを送信し、ファイルに追加します。これは、おそらくSocketAppenderを使用して実現できます。また、RollingFileAppenderを使用してログ出力をチャックに分割する方がはるかに簡単に処理できることがわかりました。
書き込み用のファイルを開いてから閉じるカスタムアペンダーを作成できます。ロックされたファイルにヒットした場合、一時停止して数回再試行する可能性があります。
カスタムアペンダーでは、複数のライターを許可する共有書き込みモードでファイルを開くこともできますが、これによりログ行の一部がマージされるのを防ぐことはできません。
大量のデータを書いていない場合は、上記の開閉メカニズムがおそらく最良の選択肢です。ファイルを常に開いたり閉じたりするため、大量のデータをログに記録している場合、パフォーマンスに顕著な影響が出る可能性があります。
より複雑なメカニズムですが、高性能のロギングパスを提供できるメカニズム:TCPまたはUDP経由でログ行を受信するロギングサービスを記述します。サービスは、データのバッファリングとディスクへの書き込みを担当します。過去にこのアプローチを(Log4Netではなく、一般的なソリューションとして)使用して、ログの書き込み効率を改善しました。
タイムスタンプを使用して生成された一意のファイル名など、プロセスごとに異なるログファイルを作成することを検討してください。
InterProcessLockを使用するMinimalLockの代わりに、複数のプロセスが単一のログファイルにアクセスする場合のデータ損失を削減できます。
log4net.Appender.FileAppender+InterProcessLock