log4net 대 TraceSource
에서 이 스레드 많은 사람들이 log4net을 사용하는 것이 지적했다. 저는 TraceSources의 팬이며 log4net이 사용되는 이유를 알고 싶습니다.
추적 소스를 좋아하는 이유는 다음과 다양합니다.
- 플러그 형 리스너 -XML, TextFile, Console, EventLog, 직접 롤링
- 사용자 정의 가능한 추적 스위치 (오류, 경고, 정보, 상세 정보, 시작, 종료, 사용자 정의)
- 설명 구성
- 로깅 애플리케이션 블록은 TraceListeners의 큰 집합 일뿐입니다.
- 활동 / 범위의 상관 관계 (예 : ASP.NET 요청 내의 모든 로그를 지정된 고객과 연결)
- Service Trace Viewer를 사용하면 다음과 같은 이벤트를 사용할 수 있습니다.
- 모두 app.config / web.config에서 구성 할 수 있습니다.
.NET 프레임 워크는 내부적으로 TraceSources를 사용하기 때문에 추적을 구성하는 일관된 방법을 제공합니다. log4net을 사용하면 TraceSource가 아니라 log4net도 구성해야합니다.
log4net은 TraceSource가 제공하지 않는 (또는 사용자 지정 TraceListener를 작성하여 수행 할 수없는) 무엇을 제공합니까?
나는 log4net이 당신이 나를 위해 모든 것을 갖추고 생각합니다.
플러그인 가능한 리스너는 어 펜더처럼 들립니다. 그 수가 많고, 실제로 롤링 로그 파일을 해킹하여 항상 .log (파일 연결 용)로 끝나고, 이메일 어 펜더에 cc 필드를 추가하고, 마지막으로 내가 좋아하는 값을 조정했습니다. 컬러 콘솔 어 펜더. 내가 너무 대담 할 수있는 권한-내 컬러 콘솔 행복 :
<appender name="ColoredConsoleAppender" type="log4net.Appender.ColoredConsoleAppender">
<!-- Can Use:
Blue
Green
Red
White
Yellow
Purple
Cyan
HighIntensity
-->
<mapping>
<level value="FATAL" />
<foreColor value="Yellow, HighIntensity" />
<backColor value="Red" />
</mapping>
<mapping>
<level value="ERROR" />
<foreColor value="White" />
<backColor value="Purple, HighIntensity" />
</mapping>
<mapping>
<level value="WARN" />
<backColor value="Blue" />
<foreColor value="White" />
</mapping>
<mapping>
<level value="INFO" />
<backColor value="Green" />
<foreColor value="White" />
</mapping>
<mapping>
<level value="DEBUG" />
<foreColor value="White" />
</mapping>
<layout type="log4net.Layout.PatternLayout">
<!--<conversionPattern value="%date [%thread] %-5level %logger [%property{NDC}] - %message%newline" />-->
<!--<conversionPattern value="%-5level %file:%line - %message%newline" />-->
<conversionPattern value="%level %logger:%line %newline %message%newline" />
</layout>
사용자 정의 가능한 추적 스위치 : Log4net은 자세한 정도를 높이기 위해 치명적 오류 경고 정보 디버그와 함께 제공됩니다. 내가 실제로 놓친 유일한 것은 누가 무엇을 기록했는지에 대한 감사입니다.
사용자 정의 가능한 구성 : 실행에로드하는 log4net.config (또는 구성을 로그에 기록합니다.)
Try
' Get log4net configuration from file
Dim logConfigFile As FileInfo
logConfigFile = New FileInfo(".\log4net.config")
If logConfigFile.Exists Then
XmlConfigurator.Configure(logConfigFile)
Else
CreateEmergenceLogFile(logConfigFile.FullName)
End If
Catch ex As Exception
Console.Out.WriteLine("Could not load the log4net config file")
End Try
TraceListeners의 큰 세트 : 건너 뛰기 죄송합니다. 귀하의 말을 듣겠습니다.
활동 / 범위의 상관 관계 : 모든 파일 (읽기 클래스)이 별도의 로그 수준 임계 값을 수있는 고유 한 명명 된 로그를 가져 오는 것처럼 의미합니까? 실제로 단일 클래스 로깅을 분할 할 수 있습니다 (실제로는 너무 많은 작업을 수행하도록 성장했을 수 있습니다 ...).
클래스 파일에서 :
Private Shared _logger As log4net.ILog = _
log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType)
Private Shared _loggerAttribute As log4net.ILog = _
log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType.FullName & ".Attribute")
Private Shared _loggerCache As log4net.ILog = _
log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType.FullName & ".Cache")
서비스 추적 뷰어 : log4net.config에서 :
<logger name="NipissingU.ADWrapper.EntryTools.Attribute">
<level value="INFO" />
</logger>
<logger name="NipissingU.ADWrapper.EntryTools.Cache">
<level value="WARN" />
</logger>
모두 app.config / web.config에서 구성 할 수 있습니다. ASP.NET에서 좋은 점일 수도 있습니다. 모르겠지만 리치 클라이언트 빈 계산 앱을 만들 때는 별도의 구성 파일을 좋아합니다.
여기에있는 모든 것은 내 작은 사용 트릭 일뿐입니다.
hth, -Mike
초기 (.NET 1.0)에는 .NET Framework의 추적이 매우 제한되었습니다.
예를 들어 TraceSource 파티셔닝은 .NET 2.0까지 오지 않았고 원하는 경우 파티셔닝에 6 개의 부울 스위치를 사용할 수 있었지만 4 가지 수준 (오류, 경고, 정보, Verbose) 만있었습니다.
log4j는 Java에서 인기가 많으므로 .NET 포트에 대한 많은 지원을 받았으며, 일단 인기를 얻었을 때 사람들이 제대로 사용하지 않더라도 (예 : 싱글 톤 로거로 래핑하고 주요 기능입니다).
그래도 log4net 및 기타 프레임 워크 (예 : NLog, Common.Logging, 심지어 EntLib)는 처음부터 자체 로깅 시스템을 구현하여 잘못된 방식으로 진행되었다고 생각합니다. 즉, 처음부터 로그 문을 작성하는 방식까지 변경했습니다.
특히 .NET 2.0 이후로 이미 .NET에있는 것의 견고한 기반을 확장하는 데 노력을 기울이는 것을 선호했습니다. 이미 존재하는 것을 확장하는 프로젝트의 경우 CodePlex ( http://essentialdiagnostics.codeplex.com/ ) 의 Essential Diagnostics 프로젝트를 살펴보십시오 .
log4net의 장점 :
혼합 환경을 실행하고 일관된 로깅을 원하는 경우 log4j와 유사합니다.
설정을 상속하는 자동 로거 계층은 사용자가 구현하고 각각을 구성해야하는 추적 소스의 수에 비해 매우 깔끔합니다. (일부 경우에는 과도하게 죽일 수 있지만).
log4net에는 이미 약 28 개의 어 펜더 (추적 리스너와 동일)가있는 반면 System.Diagnostics에는 10 개만 있습니다 (더 자세한 내용은 Essential.Diagnostics 프로젝트 참조). 따라서 RemoteSyslogAppender, NetSendAppender, AnsiColorTerminalAppender 또는 TelnetAppender가 필요할 수 있다고 생각한다면 당신은 운이 좋다.
단점 (System.Diagnostics와 비교) :
다른 로깅 구문을 사용해야하므로 이미 source.TraceEvent ()를 사용하고있는 경우 모든 내용을 살펴보고 교체해야합니다.
이것은 또한 상관 관계에 대한 다른 구문으로 확장되므로 CorrelationManager에서 log4net 컨텍스트로 변경해야합니다.
프레임 워크 추적 (예 : WCF)과 쉽게 통합되지 않습니다.
이벤트 ID에 대한 지원이 부족합니다 (별도의 확장 프로젝트 IEventLog를 사용해야 함).
Windows 용 이벤트 추적 (Vista) 또는 서비스 추적 뷰어 XML 형식은 아직 지원하지 않습니다.
Log4Net 대신 TraceSources를 사용하는 또 다른 이유는 자체 추적입니다. Log4Net은 로깅 (메시지)에만 사용할 수 있지만 개체를 추적하는 방법 (동시에 여러 정보)은 무엇입니까? 물론 Log4Net에는 많은 리스너가 구현되어 있지만이 모든 것이 필요합니까? 대부분의 경우 그렇지 않습니다. 특별한 리스너가 필요하다면 내 자신의 리스너를 구현하는 것만 큼 어렵지 않습니까? 예를 들어 데이터베이스 (메시지뿐만 아니라 다른 정보 {string 's, int 's, etc.} 동시에)를 추적하려면 리스너가 필요합니다.
내가 맞아?
내가 추적 중 하나를 사용하는 것보다 Log4Net을 선호하는 이유-Log4Net을 사용하면 애플리케이션의 다른 계층 (데이터 액세스, 서비스, 비즈니스 로직 등)과 다른 하위 시스템 (인증, 처리 등)을 독립적으로 계측하고 켜거나 / 각 하위 시스템의 로깅을 독립적으로 해제합니다.
이러한 유연성 덕분에 전체 시스템에 대한 Firehose를 켜지 않고도 하나의 하위 시스템에 대한 자세한 로깅을 구성 할 수 있습니다.
Trace 클래스 [예 : TraceInformation ()]에서 제공되는 정적 메서드는 로깅의 하위 시스템을 지정하는 방법을 제공하지 않으므로 자체 TraceListener를 작성하여 쉽게 제공 할 수 없습니다.
또 다른 이유는 성능입니다. 잠재적으로 초당 수천 개의 메시지를 기록하는 내 애플리케이션이 있습니다. Log4Net은 낮은 오버 헤드를 부과합니다. 대조적으로, 지난번에 살펴 보았을 때 로깅 애플리케이션 블록은 기록 된 모든 메시지에 대해 XML 구성을 다시 분석하여 블록을 매우 무겁고 느리게 만듭니다.
Im은 log4net이 작동하는 방식 만 알고 있지만 해당 프레임 워크를 사용하는 것에 대한 명백한 보너스는 log4j 사용에 익숙한 사람들에게 즉각적인 친숙 함입니다.
또 다른 작은 이점은 log4net을 사용한 테스트 주행 로깅이 매우 간단하다는 것입니다. 로거는 log4net.ILog를 구현합니다. 다시 저는 Microsoft 솔루션에 익숙하지 않지만 System.Diagnostics.Trace 클래스에 먼저 파사드를 작성하지 않고이를 수행하는 방법이 궁금합니다.
추적 소스 문서를 간략하게 살펴보면 레이아웃에 해당하는 항목을 찾을 수 없었으며 해당 항목이 있는지 알고 싶습니다. PatternLayout은 날짜 스탬프, 스레드 정보, 로그 컨텍스트 등과 같은 공통 데이터로 로그 항목을 형식화하는 데 매우 편리합니다. Log4net PatternLayout 문서 : http://logging.apache.org/log4net/release/sdk/log4net.Layout.PatternLayout.html
또한 로깅 프레임 워크에 대한 확장을 작성하는 것이 아마도 고전적인 '메타 문제'일 수 있다는 점을 감안할 때 log4net은 플러그 가능한 리스너와 동등한 목록을 테이블에 가져옵니다.
어 펜더 목록 : http://logging.apache.org/log4net/release/config-examples.html
참고 URL : https://stackoverflow.com/questions/576456/log4net-versus-tracesource
'ProgramingTip' 카테고리의 다른 글
스칼라 변수를 선언해야합니다. (0) | 2020.11.02 |
---|---|
셸 명령의 결과로 CMake 변수를 초기화하는 방법 (0) | 2020.11.02 |
모든 Scalatest 테스트 전후에 조치 수행 (0) | 2020.11.02 |
함수를 호출하는 백틱 (0) | 2020.11.02 |
MySQL 테이블에 여러 행을 삽입하고 새 ID를 지불해야합니까? (0) | 2020.11.02 |