5

Log4Netアプリケーションで例外をログに記録するために使用してい.Net Windows serviceます。

私の Windows サービス アプリケーションは で実行multi-threading executionされています。つまり、各タスクはそれぞれ異なるスレッドで処理されており、Delegate - (BeginInvoke)パターンを使用しています。

重要なのは、 アプリケーションのさまざまなシナリオに基づいてdynamic properties複数のログ ファイルを動的に生成するために使用していることです。Log4Net

さて、すべてのlogging/ exceptionシナリオ (C# メソッド) で、Logger.Logメソッドを使用して info/exception をログに記録しましたLog4Net

コード (動的ファイル生成)

GlobalContext.Properties[FileNameParameter] = DirectoryName + fileName;
LogManager.Info(logMessage);

構成設定

<appender name="RollingFileAppender" type="log4net.Appender.RollingFileAppender">
      <file type="log4net.Util.PatternString" value="D:\Data\%property{FileName}_info.log"/>
</appender>

問題は (私が信じている)、マルチスレッド コードの実行により、Log4Net で次のような奇妙な結果が得られることです。

  1. ログ ファイルが生成されることがありますが、メッセージの内容はありません。
  2. ファイル自体が生成されないことがあります。
  3. いくつかのファイルが生成されることもあれば、生成されないこともあります。

Log4Net がこのように動作する理由を教えてください。マルチスレッド コード実行による安定したロギングが必要です。

前もって感謝します!

4

1 に答える 1

4

私はあなたがしていることを実際にやろうとはしていませんが、あなたのコードには問題を引き起こす 2 つの問題があることがわかります。(ログ情報が失われることはないと思いますが、情報が間違ったファイルに送られることは予想されます)。

まず、異なるスレッドでプロパティが変更されることが予想される場合は、GlobalContext ではなくThreadContextを使用する必要があります。その問題は簡単に修正できます。

2 番目の問題は、より問題になる可能性があります。Log4net は、プログラムの実行中にベース ファイル名が変更されることを想定しておらず、プロパティを変更した後でも古いファイル名に書き込み続ける可能性があります。

これを回避する最も簡単な方法の 1 つは、ロガーを再初期化することです。app.config から xml 構成を使用している場合はlog4net.Config.XmlConfigurator.Configure();、プロパティを設定した後に呼び出すことができます。これには明らかにオーバーヘッドがあり、このオーバーヘッドが許容できるかどうかを判断する必要があります。

于 2013-05-21T16:33:11.687 に答える