1. ホーム
  2. locking

[解決済み] log4net RollingFileAppenderのファイルロック問題が断続的に発生する。

2022-05-17 06:56:15

質問

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

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

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

このプロセスは、ファイル'C:³³³.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" />

この問題に対する私たちの現在の回避策は、最後のログ ファイルの名前を変更することです。もちろん、これは (前述のファイル ロックのために) 失敗すると予想されますが、通常は失敗しません。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>

前述のように、私たちはマシン上で断続的にこの現象を確認していますが、一度問題が起こると持続します。

どのように解決するのですか?

を追加してみてください。

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

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

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

(デバッグするとき、優雅でない終了と多くの新しいワーカー プロセスのスピンアップは、まさに起こりそうなタイプのものです)。

がんばってください!