log4net (로거 이름 지정)을 사용하는 올바른 방법


83

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을 어떻게 사용합니까? 시스템의 각 부분이 자체 로거에 기록하거나 모든 것이 기본 로거에 기록되고 구성이 다음에 수행 할 작업을 결정합니까?

답변:


96

코드 내에서 메시지를 기록하는 방법과 관련하여 두 번째 방법을 선택합니다.

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 및 자체 코드에 대해 다른 로깅 수준을 지정할 수 있어야합니다.

자세한 내용은 로깅에 대해 작성한 코드 프로젝트 기사입니다.


5
PatternLayout logging.apache.org/log4net/release/sdk/… 를 사용하여 로그의 노이즈를 줄이기 위해 클래스 네임 스페이스의 로그 부분에서 제외 할 수도 있습니다. "예를 들어 로거 이름"abc "의 경우 % logger {2} 패턴은 출력 "bc". "
AlfeG

7
개인 정적 읽기 전용 ILog log = LogManager.GetLogger (System.Reflection.MethodBase.GetCurrentMethod (). DeclaringType);
Casper Leon Nielsen

두 번째 접근 방식이 첫 번째 접근 방식보다 나은 이유는 무엇입니까?! 클래스 이름은 정적이며 변경하면 로거의 이름도 업데이트해야합니다. 클래스 이름을 가져 오기 위해 리플렉션 호출을 발생시키는 것이 어떤 의미가 있습니까?
MeTitus

1
@CasperLeonNielsen 그게 어떻게 다른지 설명해 주 시겠어요 this.GetType()?
ErikE

2
@ErikE this.GetType ()은 정적 속성을 정의 할 때나 정적 클래스에서 또는 생성자 외부에서 사용할 수 없습니다.
dhochee

11

내 답변이 늦어 질 수 있지만 초보자를 도울 수 있다고 생각합니다. 아래와 같이 변경하지 않으면 실행 된 로그를 볼 수 없습니다.

2 Log4net을 구현할 때 파일이 변경되어야합니다.


  1. 프로젝트 에 log4net.dll의 참조를 추가하십시오 .
  2. app.config
  3. 로그를 구현할 클래스 파일입니다.

[ 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");

ILog인스턴스 멤버 를 만들 필요가 없습니까? 여기서 더 자세히 동일한 질문을 했지만 아마도 귀하의 의견을 얻을 수 있습니까?
Minh Tran

5

호출 클래스의 이름을 지정하는 대신 다음을 사용하기 시작했습니다.

private static readonly ILog log = LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);

이런 식으로 복사하여 붙여 넣을 때 코드를 변경할 필요없이 log4net을 사용하는 모든 클래스에서 동일한 코드 줄을 사용할 수 있습니다. 또는 로깅 클래스를 만들고 다른 모든 클래스가 로깅 클래스에서 상속되도록 할 수 있습니다.


0

두 번째 접근 방식의 단점은 생성 된 로거가있는 큰 저장소입니다. 이 로거는 루트가 정의되고 클래스 로거가 정의되지 않은 경우 동일한 작업을 수행합니다. 생산 시스템의 표준 시나리오는 클래스 그룹 전용 로거를 거의 사용하지 않습니다. 제 영어 죄송합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.