13

プロジェクトで log4net を使用していますが、問題が 1 つあります。プログラムの主要な機能には時間がかかるため、ログを使用して情報を保存しています。ログをファイルに保存するためにFileAppenderを使用します。

私のアプリケーションは共有 (ローカル) フォルダーにあり、1 つのパスから実行されているアプリケーションの複数のインスタンスが存在する可能性があります。この場合、最初のプログラムからのみ情報をログに記録できました。ログ ファイルがロックされているため、アプリケーションの他のインスタンスは情報をログに記録できませんでした。

「log4net.Appender.FileAppender+MinimalLock」オプションを使用すると、情報が失われる場合があります。両方のインスタンスのすべてのログがファイルに保存されるわけではありません。

この問題を解決し、並列インスタンスから情報をログに記録するにはどうすればよいですか? また、「MinimalLock」オプションを使用した場合のパフォーマンスの低下はどうですか?

ありがとう。あなたの助けを願っています。

4

6 に答える 6

20

アプリケーションのプロセス ID をログ ファイル名に含めるだけです。その後、アプリのさまざまなインスタンスがさまざまなファイルにログを記録します。次に例を示します。

<appender name="MyRollingFileAppender" type="log4net.Appender.RollingFileAppender">
  <file type="log4net.Util.PatternString">
    <conversionPattern value="log_%processid.log" />
  </file>
<!-- ... -->
于 2010-10-11T16:12:34.563 に答える
4

一元化されたロギングソリューションが望ましい場合、これは典型的な状況だと思います。ファイルについて心配してパフォーマンスのボトルネックに悩まされる代わりに、ログの保存と処理を処理するリモートサービスに非同期でログステートメントを送りたいと思います。logFacesと呼ばれるこのログアグリゲーターを見てください。これは、アプリケーションをログの管理から切り離すことを目的として設計されました。標準のlog4netUDPアペンダーで動作し、アプリケーション、ホスト、スレッドなどごとにログデータを分割し、本当に必要なときにいつでもログファイルを作成できるようにします。

開示:私はこの製品の作者です。

于 2009-12-01T15:20:19.583 に答える
1

ファイルを開いて書き込むカスタム アペンダーを作成し、それを閉じることができます。ロックされたファイルにヒットした場合、一時停止して数回再試行する可能性があります。

カスタム アペンダーでは、複数のライターを許可する共有書き込みモードでファイルを開くこともできますが、これはログ行の断片が一緒にマージされることを妨げません。

大量のデータを書き込んでいない場合は、上記のオープン/クローズ メカニズムがおそらく最良のオプションです。ファイルを頻繁に開いたり閉じたりするため、大量のデータをログに記録している場合、パフォーマンスに顕著な影響が出る可能性があることに注意してください。

より複雑なメカニズムですが、高パフォーマンスのログ パスを提供できるメカニズム: TCP または UDP 経由でログ行を受信するログ サービスを記述します。このサービスは、データのバッファリングとディスクへの書き込みを担当します。過去にこのアプローチを使用して (Log4Net 経由ではなく、一般的な解決策として)、ログの書き込み効率を改善しました。

于 2009-11-28T19:22:41.573 に答える
0

おそらく、各インスタンスから異なるファイルにログを記録しますか? それ以外の場合は、おそらくログ専用の別のプロセスをセットアップする必要があります。プログラムの各インスタンスはそこにログ メッセージを送信し、それをファイルに追加します。これは、おそらく SocketAppender を使用して実現できます。また、RollingFileAppender を使用してログ出力をチャックに分割する方がはるかに扱いやすいことがわかりました。

于 2009-11-28T16:36:18.993 に答える
0

おそらく、タイムスタンプを使用して生成された一意のファイル名を使用して、プロセスごとに異なるログ ファイルを作成することを検討してください。

于 2009-11-28T19:26:36.777 に答える