117

開発マシンと運用マシンで、ログ ファイルがログに記録されない断続的な問題が発生しています。

Visual Studio を使用して開発およびデバッグを実行すると、VS 出力ウィンドウに次の log4net エラー メッセージが表示されます。

log4net:ERROR [RollingFileAppender] Unable to acquire lock on file C:\folder\file.log.

別のプロセスで使用されているため、プロセスはファイル 'C:\folder\file.log' にアクセスできません。

log4net:ERROR XmlConfigurator: Failed to find configuration section 'log4net' in the application's .config file.
Check your .config file for the <log4net> and <configSections> elements.

構成セクションは次のようになります。

<section
  name="log4net"
  type="log4net.Config.Log4NetConfigurationSectionHandler,log4net" />

この問題に対する現在の回避策は、最後のログ ファイルの名前を変更することです。もちろん、(前述のファイル ロックのために) これが失敗することが予想されますが、通常はそうではありません。aspnet_wp.exeプロセスからのロックが原因で、名前の変更が 1 回か 2 回失敗しました。

log4net 構成セクションを以下に示します。

<log4net>
  <appender name="RollingLogFileAppender" type="log4net.Appender.RollingFileAppender">
    <file value="C:\folder\file.log"/>
    <appendToFile value="true" />
    <datePattern value="yyyyMMdd" />
    <rollingStyle value="Date" />
    <maximumFileSize value="10MB" />
    <maxSizeRollBackups value="100" />
    <layout type="log4net.Layout.PatternLayout">
      <header value="[Header]&#xA;"/>
      <footer value="[Footer]&#xA;"/>
      <conversionPattern value="%date %-5level %logger ${COMPUTERNAME} %property{UserHostAddress} [%property{SessionID}] - %message%newline"/>
    </layout>
  </appender>
  <root>
    <level value="INFO"/>
    <appender-ref ref="RollingLogFileAppender"/>
  </root>
</log4net>

前述のように、これはマシンで断続的に見られますが、問題が発生すると持続します。

4

3 に答える 3

176

追加してみる

<lockingModel type="log4net.Appender.FileAppender+MinimalLock" />

あなたの<appender />要素に。これは、log4net がファイルをロックし、ファイルに書き込み、書き込み操作ごとにロックを解除することを意味するため (ロックを取得して長時間保持するデフォルトの動作とは対照的です)、パフォーマンスに多少の影響があります。

デフォルトの動作の 1 つの意味は、同じマシン上で実行されている複数のワーカー プロセスの下で実行されている Web サイトで使用している場合、それぞれがそのロックを無期限に取得して保持しようとし、そのうちの 2 つが負けるだけ。ロック モデルを最小ロックに変更すると、この問題を回避できます。

(デバッグ時に、不適切な終了と多くの新しいワーカー プロセスのスピンアップは、まさに起こりそうなことです。)

幸運を!

于 2010-01-04T13:12:15.593 に答える
42

また、log4net FAQにも注意してください。

複数のプロセスを同じファイルに記録するにはどうすればよいですか?

提供されている代替手段を試し始める前に、複数のプロセスを同じファイルに記録する必要があるかどうかを自問してから、実行しないでください;-)。

FileAppender は、このユースケースに対してプラグ可能なロック モデルを提供しますが、既存のすべての実装には問題と欠点があります。

デフォルトでは、FileAppender は、ログを記録している間、ログ ファイルに対して排他的な書き込みロックを保持します。これにより、他のプロセスがファイルに書き込むことができなくなります。このモデルは、(少なくとも一部のバージョンの) Linux の Mono では機能しないことが知られており、別のプロセスがログ ファイルにアクセスしようとするとすぐにログ ファイルが破損する可能性があります。

MinimalLock は、ログが書き込まれている間のみ書き込みロックを取得します。 これにより、パフォーマンスが大幅に低下しますが、複数のプロセスが同じファイルへの書き込みをインターリーブできます。

InterProcessLock はファイルをまったくロックしませんが、システム全体の Mutex を使用して同期します。これは、すべてのプロセスが協力している (そして同じロック モデルを使用している) 場合にのみ機能します。書き込まれるログ エントリごとに Mutex を取得して解放すると、パフォーマンスが低下しますが、MinimalLock を使用するよりも Mutex を使用することをお勧めします。

RollingFileAppender を使用すると、複数のプロセスが同時にログ ファイルのローリングを開始しようとする可能性があるため、事態はさらに悪化します。RollingFileAppender は、ファイルのローリング時にロック モデルを完全に無視します。ファイルのローリングは、このシナリオと互換性がありません。

より良い代替手段は、プロセスが RemotingAppenders にログを記録するようにすることです。RemoteLoggingServerPlugin (または IRemoteLoggingSink) を使用すると、プロセスはすべてのイベントを受信し、それらを 1 つのログ ファイルに記録できます。例の 1 つは、RemoteLoggingServerPlugin の使用方法を示しています。

于 2013-06-06T15:30:54.567 に答える
8

あなたが持っている場合

<staticLogFileName value="true" />
<rollingStyle value="Date" />
<datePattern value="yyyyMMdd" />

そして追加

<lockingModel type="log4net.Appender.FileAppender+MinimalLock" />

ローリング中にエラーが発生します。最初のプロセスでは、新しいファイルが作成され、現在のファイルの名前が変更されます。次に、次のプロセスで同じことが行われ、新しく作成されたファイルが取得され、新しく名前が変更されたファイルが上書きされます。最終日のログフィールドが空になります。

于 2010-12-20T10:45:09.963 に答える