Programming

간헐적 인 log4net RollingFileAppender 잠금 파일 문제

procodes 2020. 8. 5. 20:51
반응형

간헐적 인 log4net RollingFileAppender 잠금 파일 문제


로그 파일이 기록되지 않는 개발 및 프로덕션 시스템에서 간헐적 인 문제가 발생했습니다.

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 프로세스 의 잠금으로 인해 이름 바꾸기가 한두 번 실패했습니다 .

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이 파일을 잠그고 파일에 기록하며 각 쓰기 작업마다 파일을 잠금 해제한다는 것을 의미하기 때문에 성능에 약간의 영향이 있습니다.

기본 동작의 한 가지 의미는 동일한 시스템에서 실행되는 여러 작업자 프로세스에서 실행되는 웹 사이트에서이를 사용하는 경우 각각 해당 잠금을 무기한으로 획득하려고 시도하며 그 중 두 가지는 그냥 잃을거야. 잠금 모델을 최소 잠금으로 변경하면이 문제를 해결할 수 있습니다.

(디버깅시, 부실한 해지 및 많은 새로운 작업자 프로세스의 가동은 정확히 일어날 수있는 유형입니다.)

행운을 빕니다!


log4net FAQ 도 알고 있어야합니다 .

동일한 파일에 여러 프로세스를 기록하려면 어떻게해야합니까?

제공된 대안을 시도하기 전에 여러 프로세스가 동일한 파일에 실제로 로그를 기록해야하는지 스스로에게 물어보십시오. ;-).

FileAppender는이 사용 사례에 대해 플러그 가능한 잠금 모델을 제공하지만 기존의 모든 구현에는 문제와 단점이 있습니다.

기본적으로 FileAppender는 로그 파일이 로깅되는 동안 독점 쓰기 잠금을 보유합니다. 이것은 다른 프로세스가 파일에 쓰지 못하게합니다. 이 모델은 Linux에서 (최소 일부 버전의) Mono로 분류되는 것으로 알려져 있으며 다른 프로세스가 로그 파일에 액세스하려고하면 로그 파일이 손상 될 수 있습니다.

MinimalLock은 로그를 쓰는 동안 쓰기 잠금 만 획득합니다. 따라서 여러 프로세스가 동일한 파일에 쓰기를 인터리브 할 수 있지만 성능이 크게 저하됩니다.

InterProcessLock은 파일을 전혀 잠그지 않고 시스템 전체 Mutex를 사용하여 동기화합니다. 이것은 모든 프로세스가 협력하고 동일한 잠금 모델을 사용하는 경우에만 작동합니다. 기록 될 모든 로그 항목에 대해 Mutex를 획득 및 릴리스하면 성능이 저하되지만 MinimalLock을 사용하는 것이 좋습니다.

RollingFileAppender를 사용하면 여러 프로세스가 동시에 로그 파일 롤링을 시작하려고 할 때 상황이 더욱 악화됩니다. RollingFileAppender는 파일을 롤링 할 때 잠금 모델을 완전히 무시합니다. 롤링 파일은이 시나리오와 호환되지 않습니다.

A better alternative is to have your processes log to RemotingAppenders. Using the RemoteLoggingServerPlugin (or IRemoteLoggingSink) a process can receive all the events and log them to a single log file. One of the examples shows how to use the RemoteLoggingServerPlugin.


If you have

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

and add

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

then there will be an error while the rolling happens. The first process will create the new file and the rename the current file. Then next proces will do the same and take the newly created file and overwrite the newly renamed file. Resulting in the logfiel for the last day being empty.

참고URL : https://stackoverflow.com/questions/1999382/intermittent-log4net-rollingfileappender-locked-file-issue

반응형