문제

Log4Net 사용과의 차이점을 조사하고 있습니다 System.Diagnostics.Trace 로깅의 경우, 내가 관찰 한 성능 차이에 대해 궁금합니다.

여러 시나리오에서 두 로깅 방법의 성능을 비교하기위한 테스트 응용 프로그램을 만들었고 Log4Net이 Trace 수업. 예를 들어, 문자열 형식이없는 1,000 개의 메시지를 기록하는 시나리오에서 Log4Net의 평균 실행 시간 1,000 개 이상의 시험 시간은 9.00ms입니다. Trace 평균 1.13ms로 실행됩니다. 많은 테스트 사례가 LOG4NET 실행 시간에서 상대적으로 많은 양의 차이를 가지고 있습니다. 이상치 긴 실행의 주기적 특성은 GC 간섭을 암시하는 것으로 보인다. CLR Profiler와 함께 Poking은 많은 양의 컬렉션이 있음을 확인합니다. log4net.Core.LoggingEvent 생성 된 물체 (공정하게, 그것은 Trace 많은 톤을 생성합니다 Char[] 객체도 있지만 log4net의 큰 차이를 표시하지 않습니다.)

내가 여기서 명심하고있는 한 가지는 log4net이 약 9 배 느린 것보다 Trace, 차이는 1,000 개 이상의 반복입니다. 이것은 정확히 중요한 성능 배출물이 아닙니다. 그럼에도 불구하고 예상되는 사용 사례 중 일부는 수십만 번 물건을 기록하는 방법을 호출하는 것일 수 있으며,이 숫자는 내 빠른 기계에서 나온 것입니다. 사용자의 구성 중 일반적인 느린 기계에서 차이는 170ms ~ 11ms이며, 이는 약간 더 놀라운 것입니다.

이 성능은 log4net의 전형적인가요, 아니면 Log4Net의 성능을 크게 향상시킬 수있는 gotchas가 있습니까?

(참고 : 문자열 서식이 실행 시간을 변경할 수 있음을 알고 있습니다. 나는 사과를 사과와 비교하려고 노력하고 있으며 서식이없는 테스트 케이스가 없습니다. Log4net은 문자열 서식이 사용되는지 여부에 관계없이 비례 적으로 느려집니다.)

지금까지의 이야기:

  • 로버트 굴드 (Robert Gould)는이 질문에 대한 최상의 답을 가지고 있습니다. log4net이 Trace 수업.
  • Alex Shnayder의 답변은 흥미로운 정보이지만 실제로 질문의 범위에 속하지는 않습니다. 이 로깅을 도입하려는 의도의 절반은 라이브 시스템에서 논리적 및 성능 문제를 모두 디버깅하는 데 도움이됩니다. 고객은 비싸고 대규모 하드웨어 구성없이 재생산하기 어려운 많은 이국적인 시나리오에 제품을 투입합니다. 저의 주요 관심사는 "로깅되지 않음"과 "로깅"사이의 큰 타이밍 차이가 버그가 발생하지 않는 방식으로 시스템에 영향을 줄 수 있다는 것입니다. 결국, 성능 감소의 척도는 크지 만 크기는 작기 때문에 문제가되지 않기를 바랍니다.
도움이 되었습니까?

해결책

예 로그 4xxx는 트레이스보다 느리게 이루어집니다. 트레이스는 일반적으로 가까운 커널 도구이기 때문에 Log4xxx는 훨씬 더 강력한 도구입니다. 개인적으로 나는 fexibility이기 때문에 log4xxx를 선호하지만, 당신이 그다지 영향을 미치지 않는 것을 원하고 실제로 생산 로그가 필요하지 않다면, 디버그에서만 트레이스 만 충분해야합니다.

참고 : log4xxx를 사용합니다.

다른 팁

당신은 관심이있을 수 있습니다 공통 .Logging 라이브러리. 기존 로깅 구현에 비해 얇은 추상화 래퍼이며 런타임에 원하는 로깅 프레임 워크를 연결할 수 있습니다. 또한 System.Diagnostics.Trace보다 훨씬 빠릅니다. 성능에 대한 블로그 게시물.

HTH, 에리히

내 경험에서 Log4net 성능은 대부분의 경우 문제가되지 않습니다. 진짜 질문은 생산 시스템에서 왜 "수십만 번을 로그인"해야하는지에 대한 것입니다.
내가 알 수 있듯이, 생산에서는 최소값 만 기록해야하며 (정보는 경고 수준 일 수 있음) 필요한 경우에만 (현장에서 문제를 디버깅하는 경우) 디버그 레벨에서 디버깅을 활성화해야합니다.

두 세계의 최고를 원한다면 Log4Net을 사용하면 ASPNET 트레이서에도 로그인 할 수 있습니다. 로깅의 특정 이벤트에 묶인 성능 통계를 얻으려면이 옵션을 켭니다.

동일한 작업에 Log4Net을 사용하는 것과 비교하여 순환기 작성을 간단한 파일과 비교하는 테스트를 실행했습니다 .LOG4NET은 스트림 라이터와 비교하여 약 400 배 느리고 있습니다. 거대한 로그 파일에 글을 쓰는 경우 Log4Net을 사용할 수 없다고 생각합니다.. 그러나 나는 그것을 발견한다 소량의 로그 항목에 매우 유용합니다 그리고 디버깅.

경우에 따라 별도의 스레드에서 로깅을 분리하는 솔루션 일 수도 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top