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

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을 구현할 때 파일이 변경되어야합니다.


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


답변

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

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

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


답변

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


답변