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


113

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

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>

언급했듯이, 우리는이 문제가 컴퓨터에서 간헐적으로 발생하지만 일단 문제가 발생하면 지속됩니다.

답변:


172

추가 시도

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

당신의 <appender />요소에. 이는 log4net이 파일을 잠그고, 기록하고, 각 쓰기 작업에 대해 잠금을 해제한다는 것을 의미하기 때문에 성능에 약간의 영향을 미칩니다 (오랜 시간 동안 잠금을 획득하고 유지하는 기본 동작과 반대).

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

(디버깅 할 때 비정상적인 종료 및 많은 새로운 작업자 프로세스 회전이 발생할 가능성이 높은 유형입니다.)

행운을 빕니다!


내 로거가 간헐적으로 작동하는 이유에 대해 많은 머리를 긁적 거리지 않게했습니다. 앱 풀에 작업자 프로세스를 추가했습니다.
RhinoDevX64

나는 이것을 서비스에서 사용하고 있으며이 변경 사항 외에도 사용자가 쓰기에 필요한 권한으로 서비스를 실행했습니다. 감사!
LowTide 2012-06-04

감사합니다. 많은 시간을 절약했습니다.
Siva

2
난 그냥 그냥 작성하고 공유 읽기 잠금 수 ...뿐만 아니라 읽을 수 있지만 log4net 잠금 장치, 파일을 읽을 싶어
JobaDiniz

37

또한 인식 log4net 자주 묻는 질문 :

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

제공된 대안 중 하나를 시도하기 전에 동일한 파일에 여러 프로세스를 기록해야하는지 스스로에게 물어 본 다음 수행하지 마십시오 ;-).

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

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

MinimalLock은 로그가 기록되는 동안에 만 쓰기 잠금을 획득합니다. 이렇게하면 성능이 상당히 저하 되더라도 여러 프로세스가 동일한 파일에 쓰기를 인터리브 할 수 있습니다.

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

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

더 나은 대안은 프로세스가 RemotingAppenders에 기록되도록하는 것입니다. RemoteLoggingServerPlugin (또는 IRemoteLoggingSink)을 사용하여 프로세스는 모든 이벤트를 수신하고 단일 로그 파일에 기록 할 수 있습니다. 예제 중 하나는 RemoteLoggingServerPlugin을 사용하는 방법을 보여줍니다.


6

당신이 가지고 있다면

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

추가

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

롤링이 진행되는 동안 오류가 발생합니다. 첫 번째 프로세스는 새 파일을 만들고 현재 파일의 이름을 바꿉니다. 그런 다음 다음 프로세스는 동일한 작업을 수행하고 새로 생성 된 파일을 가져와 새로 이름이 변경된 파일을 덮어 씁니다. 마지막 날의 logfiel이 비어 있습니다.


1
여러 프로세스가 동일한 롤링 파일에 액세스하는 경우에만 해당됩니다. 동일한 과정에서 안전합니다. hectorcorrea.com/blog/log4net-thread-safe-but-not-process-safe
Mike Chamberlain

@MikeChamberlain OP에 따르면 (답변하려면 그의 의견 참조) log4net을 사용하여 동시에 작업하는 여러 작업자가 기록됩니다. 그러므로이 문제는 적절합니다!
seebiscuit 2014
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.