log4net을 구성하고 사용하는 두 가지 방법이 있습니다. 첫 번째는 내 어 펜더 및 관련 로거를 구성 할 수있는 경우입니다.
<!-- language: xml -->
<appender name="myLogAppender" type="log4net.Appender.RollingFileAppender" >
<file value="Logs\myLog.log" />
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%date %level - %message%n" />
</layout>
</appender>
<logger name="myLog">
<level value="All"></level>
<appender-ref ref="myLogAppender" />
</logger>
그런 다음 로그에 무언가를 쓰고 싶을 때 다음을 수행 할 수 있습니다.
ILog log = LogManager.GetLogger("myLog");
log.Info("message");
이를 사용하는 또 다른 방법은 루트를 원하는만큼 자세히 구성하는 것입니다.
<!-- language: xml -->
<root>
<level value="Error" />
<appender-ref ref="myLogAppender" />
</root>
이 경우 다음과 같은 메시지를 기록 할 수 있습니다.
ILog log = LogManager.GetLogger(typeof(Bar));
log.Info("message");
두 번째 방법의 장점은 일부 메시지를 즉시 활성화 또는 비활성화 할 수 있다는 것입니다. 그러나 문제는 내가 EPiServer CMS에서 개발 중이며 log4net을 사용하는 자체 로깅 시스템이 있으며 루트 수준에서 정보 로깅을 활성화하면 많은 시스템 로그가 기록된다는 것입니다.
log4net을 어떻게 사용합니까? 시스템의 각 부분이 자체 로거에 기록하거나 모든 것이 기본 로거에 기록되고 구성이 다음에 수행 할 작업을 결정합니까?
답변
코드 내에서 메시지를 기록하는 방법과 관련하여 두 번째 방법을 선택합니다.
ILog log = LogManager.GetLogger(typeof(Bar));
log.Info("message");
위의 로그에 전송 된 메시지는 완전한 형식을 사용하여 ‘이름이 지정’됩니다. Bar
예 :
MyNamespace.Foo.Bar [INFO] message
이 접근 방식의 장점은 로깅을 구성하기위한 사실상의 표준이며 네임 스페이스별로 로그 메시지를 필터링 할 수 있다는 것입니다. 예를 들어 INFO 수준 메시지를 기록하도록 지정할 수 있지만 로깅 수준을 Bar
특히 DEBUG로 올릴 수 있습니다 .
<log4net>
<!-- appenders go here -->
<root>
<level value="INFO" />
<appender-ref ref="myLogAppender" />
</root>
<logger name="MyNamespace.Foo.Bar">
<level value="DEBUG" />
</logger>
</log4net>
이름을 통해 로깅을 필터링하는 기능은 log4net의 강력한 기능입니다. 모든 메시지를에 기록하기 만하면이 기능의 대부분을 잃게됩니다 "myLog"
!
EPiServer CMS와 관련하여 위의 접근 방식을 사용하여 CMS 및 자체 코드에 대해 다른 로깅 수준을 지정할 수 있어야합니다.
자세한 내용은 로깅에 대해 작성한 코드 프로젝트 기사입니다.
답변
내 답변이 늦어 질 수 있지만 초보자를 도울 수 있다고 생각합니다. 아래와 같이 변경하지 않으면 실행 된 로그를 볼 수 없습니다.
2 Log4net을 구현할 때 파일이 변경되어야합니다.
- 프로젝트 에 log4net.dll의 참조를 추가하십시오 .
- app.config
- 로그를 구현할 클래스 파일입니다.
[ app.config ] 내부 :
먼저 ‘configSections’에서 아래 코드를 추가해야합니다.
<section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net" />
그런 다음 ‘configuration’블록 아래에 코드를 작성해야합니다 (이 코드는 필요에 따라 사용자 정의되지만 매력처럼 작동합니다).
<log4net debug="true">
<logger name="log">
<level value="All"></level>
<appender-ref ref="RollingLogFileAppender" />
</logger>
<appender name="RollingLogFileAppender" type="log4net.Appender.RollingFileAppender">
<file value="log.txt" />
<appendToFile value="true" />
<rollingStyle value="Composite" />
<maxSizeRollBackups value="1" />
<maximumFileSize value="1MB" />
<staticLogFileName value="true" />
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%date %C.%M [%line] %-5level - %message %newline %exception %newline" />
</layout>
</appender>
</log4net>
내부 호출 클래스 :
이 log4net을 사용할 클래스 내에서 아래 코드 조각을 선언해야합니다.
ILog log = LogManager.GetLogger("log");
이제 동일한 클래스에서 원하는 곳 어디에서나 통화 기록이 준비되었습니다. 다음은 작업을 수행하는 동안 호출 할 수있는 메서드 중 하나입니다.
log.Error("message");
답변
호출 클래스의 이름을 지정하는 대신 다음을 사용하기 시작했습니다.
private static readonly ILog log = LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);
이런 식으로 복사하여 붙여 넣을 때 코드를 변경할 필요없이 log4net을 사용하는 모든 클래스에서 동일한 코드 줄을 사용할 수 있습니다. 또는 로깅 클래스를 만들고 다른 모든 클래스가 로깅 클래스에서 상속되도록 할 수 있습니다.
답변
두 번째 접근 방식의 단점은 생성 된 로거가있는 큰 저장소입니다. 이 로거는 루트가 정의되고 클래스 로거가 정의되지 않은 경우 동일한 작업을 수행합니다. 생산 시스템의 표준 시나리오는 클래스 그룹 전용 로거를 거의 사용하지 않습니다. 제 영어 죄송합니다.