2010-04-06 5 views

답변

10

하나의 응용 프로그램이 파일을 쓰는 경우 첫 번째 응용 프로그램이 파일을 쓰기 위해 열어 두었 기 때문에 다른 응용 프로그램에서 로그에 쓸 필요가있을 때 오류가 발생할 가능성이 높습니다 . 응용 프로그램에 전용 로깅 소스를 갖는 것이 가장 좋습니다. 로그를 공유해야하는 경우 동시 작성을 처리하도록 설계된 데이터베이스를 사용하십시오.

이것은 로그 파일에 충분한 양의 쓰기를 작성하여 문제를 발견하지 못할 가능성이 있으므로 개발 중일 때 시스템에서 실제로 잘 작동하는 것 중 하나입니다. 응용 프로그램이 더 많은 부하를 받기 시작하면 문제는 스스로 표시되기 시작하고 그 시점에서 이상한 방식으로 나타날 수 있습니다. 나는 확실히 다른 해결책을 시도 할 것이다.

10

FileAppenderLockingModel에 따라 다릅니다. ExclusiveLock이면 다른 프로세스가 파일을 쓰기 위해 열 수 없습니다. 대안은 MinimalLock이지만이 목적을위한 것이 아닙니다. 다른 프로세스가 파일을 이동하거나 삭제할 수 있도록하기위한 것입니다.

+0

누구나이 방법에 대해 공유 할 경험이 있습니까? – SandRock

17

MinimalLock은 (@Mark에서 언급 한) 문제를 부분적으로 해결하지만 RollingFileAppender를 사용하는 경우 다른 문제가 발생합니다. 파일이 롤링되면 하나의 프로세스가 다른 프로세스의 새로 생성 된 로그 파일을 덮어 쓰는 경합 조건에 처할 수 있습니다.

다른 옵션에는 다른 프로세스에서 보낸 로깅 이벤트를 수신하고 기록하도록 설정된 간단한 서버가있는 RemoteLogger가 있습니다. 마찬가지로, SQL 데이터베이스에 로그 할 수 있습니다. Redis에 로그를 남기는 간단한 글을 썼습니다. Redis에서 읽고 파일에 기록하는 간단한 응용 프로그램이 필요합니다. 이러한 접근 방식의 문제점은 모두 장애 지점을 초래한다는 것입니다. 무언가가 올바르게 작동하지 않을 때 로그가 가장 필요할 때가 종종 있습니다. 그런 다음 로그가 사용 가능하지 않을 수 있습니다.

그래서 내 솔루션은 각 프로세스가 자체 파일에 로그를 남김으로써 문제를 피하는 것이 었습니다. 이는 구성 변경으로 인해 쉽게 이루어졌습니다. 당신의 (Rolling)FileAppender 구성에서 사용

<file type="log4net.Util.PatternString" value="c:\mylog-[%processid].txt" /> 

프로세스 ID가 파일 이름의 일부가됩니다. 예. 이제 여러 개의 로그 파일이 만들어 지지만 Graylog, Splunk 또는 Logscape와 같은 로그 파일 수집기가 도움이 될 수 있습니다.

1

또는 뮤텍스를 사용하여 공통 리소스를 잠그고 다른 프로세스의 공통 로그 파일에 대한 액세스를 동기화 할 수 있습니다.

0

예, 위에서 언급 한 것처럼 가능하지만 지금은이 시나리오의 스트레스 테스트를 수행했습니다.

셋업은 매우 간단하다 URL에서 카운터와 단일 항목 + 같은 페이지 1000 개 요청을 설정하는 버튼 을 기록 페이지로 설정

  1. 웹 프로젝트 (1) (logging 문에 의해 선택).
  2. 웹 프로젝트 2가 동일한 로그 파일과 동일하게 설정되었습니다.

두 단추를 동시에 클릭하면 로그 항목이 로그 전체에 산재 해 있습니다. 하지만 이것은 큰 GOTCHA입니다. 동반 요청 카운터로 판단하면 경쟁 조건이 있음이 분명합니다. 거의 모든 웹 프로젝트가 해당 항목을 로깅하는 데 성공하면 다른 하나는 실패합니다 (항목을 건너 뜁니다).

따라서이 일반 로그에 대한 트래픽이 양호하면 기본적으로 로그에 실제로 끝나는 로그 문을 보장 할 수 없습니다. 결론은 항상 프로젝트 별 로그 파일을 갖는 것입니다.

테스트는 기본값 "MinimalLock"으로 수행되었습니다. "ExclusiveLock"으로 테스트를 재실행하여, 기본적으로 로거를 구성하는 첫 번째 웹 프로젝트가 "won"인지 확인합니다. 기본적으로 다른 모든 로깅 요청은 잠그지 않습니다. 분명히, 그것은 물론입니다.

관련 문제