2016-11-18 1 views
0

최근에 C# 프로그램에서 성능 문제가 발생하여 해당 문제의 근원이 log4net 인 것을 확인했습니다. 내가 구성을 변경 MinimalLock 추가하고 정말 많이 도움이되었습니다.Log4net은 MinimalLock 설정 이후 동일한 줄을 여러 번 기록합니다.

이것은 내가 지금 내 log4net를 구성하는 방법입니다 이쪽으로부터

var hierarchy = (Hierarchy)log4net.LogManager.GetRepository(); 

var patternLayout = new PatternLayout(); 
patternLayout.ConversionPattern = "%date [%thread] %-5level %logger - %message%newline"; 
patternLayout.ActivateOptions(); 

var roller = new RollingFileAppender(); 

roller.LockingModel = new FileAppender.MinimalLock(); 
roller.LockingModel.ActivateOptions(); 

roller.Encoding = System.Text.Encoding.UTF8; 
roller.AppendToFile = true; 
roller.File = Path.Combine(Logger.LogPath, "log.txt"); 
roller.Layout = patternLayout; 
roller.MaxSizeRollBackups = 5; 
roller.MaximumFileSize = "100MB"; 
roller.RollingStyle = RollingFileAppender.RollingMode.Size; 
roller.StaticLogFileName = true; 
roller.ActivateOptions(); 

hierarchy.Root.AddAppender(roller); 
hierarchy.Root.Level = Level.Debug; 
hierarchy.Configured = true; 

의 단점은 지금 내 로그가 매우 동일한 로그 라인이 여러 번 반복이 포함되어 있다는 것입니다.

내가 log4net 구성에서 뭔가 잘못 이해 한 것 같아서 이제는 출력하려는 ​​각 로그 라인이 애플리케이션 프로세스의 많은 시간 동안 전송됩니다. (분명히 생성 된 나머지 프로세스는 아무것도 로깅하지 않습니다. 동시에 적어도 동일한 행) 여기서

로그 라인의 예 :

2016년 11월 18일 10 : 35 : 34495 [1] 디버그 MetryViewModel - 읽기 DAT! manuel.dat 구성 : 없음 2016-11-18 10 : 35 : 34,495 [1] DEBUG MetryViewModel - 읽기 : manuel.dat (config : 없음) 2016-11-1 8 : 10 : 35 : 34,495 [1] DEBUG MetryViewModel - 설정과 함께 manuel.dat 읽기 : 없음 2016-11-18 10 : 35 : 34,495 [1] DEBUG MetryViewModel - 읽기 : manuel.dat : ​​config : 없음 2016-11-18 10 : 35 : 34,495 [1] DEBUG MetryViewModel - 설정 : 없음으로 manuel.dat 읽기 2016-11-18 10 : 35 : 34,495 [1] DEBUG MetryViewModel - 읽기 : manuel.dat with 설정 : 없음 2016-11-18 10 : 35 : 34,495 [1] DEBUG MetryViewModel - 읽기 : 설정 : 없음으로 manuel.dat 2016-11-18 10 : 35 : 34,495 [1] DEBUG MetryViewModel - 읽기 : manuel.dat config : 없음 2016-11-18 10 : 35 : 34,495 [1] DEBUG MetryViewModel - config : 없음을 사용하여 manuel.dat을 읽음 2016-11-18 10 : 35 : 34,495 [1] DEBUG MetryViewModel - 읽기 : 설정 : 없음으로 manuel.dat 2016-11-1 8 : 10 : 35 : 34,495 [1] DEBUG MetryViewModel - 설정과 함께 manuel.dat 읽기 : 없음 2016-11-18 10 : 35 : 34,495 [1] DEBUG MetryViewModel - 읽기 : manuel.dat : ​​config : 없음 2016-11-18 10 : 35 : 34,495 [1] DEBUG MetryViewModel - 설정 : 없음으로 manuel.dat 읽기 2016-11-18 10 : 35 : 34,495 [1] DEBUG MetryViewModel - 읽기 : manuel.dat with 설정 : 없음 2016-11-18 10 : 35 : 34,495 [1] DEBUG MetryViewModel - 읽기 : 설정 : 없음으로 manuel.dat 2016-11-18 10 : 35 : 34,495 [1] DEBUG MetryViewModel - 읽기 : 마누엘.구성이있는 dat : ​​ 2016-11-18 10 : 35 : 34,512 [1] INFO ViewModel - 작동 모드 : Lol
2016-11-18 10 : 35 : 34,512 [1] INFO ViewModel - 작동 모드 : Lol
2016-11-18 10 : 35 : 34,512 [1] 정보 ViewModel - 작동 모드 : Lol
2016-11-18 10 : 35 : 34,512 [1] INFO ViewModel - 작동 모드 : Lol
2016-11-18 10 : 35 : 34,512 [1] 정보 ViewModel - 작동 모드 : Lol
2016-11-18 10 : 35 : 34,512 [1] INFO ViewModel - 작동 모드 : Lol
2016-11-18 10 : 35 : 34,512 [1] ] 정보 ViewModel - 작동 모드 : Lol
2016-11-18 10 : 35 : 34,512 [1] 정보 ViewModel - 작동 모드 : Lol
2016년 11월 18일 10 : 35 : 34512 [1] INFO 뷰 모델 - 작동 모드 : 롤
2016년 11월 18일 10 : 35 : 34512 [1] INFO 뷰 모델 - 작동 모드 : 롤
2016-11- 18 10 : 35 : 34,512 [1] 정보 ViewModel - 작동 모드 : Lol
2016-11-18 10 : 35 : 34,512 [1] INFO ViewModel - 작동 모드 : Lol
2016-11-18 10 : 35 : 34,512 [1] INFO 뷰 모델 - 작동 모드 : 롤
2016년 11월 18일 10 : 35 : 34512 [1] INFO 뷰 모델 - 작동 모드 : 2016년 11월 18일
롤 10 : 35 : 34512 [1] INFO 뷰 모델 - 작동 모드 : Lol
2016-11-18 10 : 35 : 34,512 [1] 정보 ViewModel - 작동 m ODE : 롤 귀하의 경우

+0

것은 여러 번 위의 코드를 실행하고 있습니까? 또한 당신이 무엇을 할 응용 프로그램이 가지고있는 프로세스만큼 많은 시간을 의미합니까? – sgmoore

+0

코드를 한 번만 실행합니다. 응용 프로그램이 많은 프로세스로 _ 인해 응용 프로그램이 여러 프로세스를 만들고 있음을 알 수 있습니다. – juagicre

+1

정말로 여러 항목을 얻으려면 여러 로거를 추가하거나 이벤트를 여러 번 기록해야합니다. 후자 인 경우 이벤트가 필요없이 표시됩니다. ing MininalLock과 타임 스탬프가 다를 수 있으므로 log4net을 여러 번 초기화하는 것처럼 보일 것입니다. 이것을 배제하기 위해'hierarchy.Configured = true;를 호출 한 직후에 (아마도 LogManager.GetRepository(). GetAppenders(). Length') 로깅을 시도하고이 메시지가 즉시 여러 번 추가되는지 확인하거나 한 번 추가 한 다음 두 번 누른 다음 세 번 등 – sgmoore

답변

2

:
메시지가 당신의 구성 요소 중 하나가 추적 리스너를 추가하고있을 가능성이 동일한 시간과 동일한 스레드에 있습니다합니다. System.Diagnostics.Trace.Listeners 속성을 확인하십시오.
그것이 원인은 여러 펜더로의 가능성을 제거 : 내 경우
그것은 시작 : 다른 사람을 위해 OWIN interferes with log4net

에 그들을 추가 Owin 서버이었다.
LogManager.GetRepository().GetAppenders().Length;
로거가 루트 로거의 애펜더를 상속한다는 점을 기억하십시오.

한 번만 가 (당신이 당신의 conversationPattern에 [% 스레드]을 추가하여 스레드 ID를 인쇄 할 수 있습니다라고 코드입니다 있는지 확인합니다.

<layout type="log4net.Layout.PatternLayout"> 
    <param name="ConversionPattern" value="%date [%thread] %message%newline" /> 
    </layout> 
관련 문제