2009-03-16 7 views
58

"myprogram"로거에 대해 많은 log4net 호출을하는 프로그램이 있습니다. 또한 log4net을 다른 로거에 호출하는 다른 코드를 호출합니다. "myprogram"에 대한 INFO보다 높은 모든 로그를 캡처하고 다른 모든 것에 대해서는 WARN보다 높은 모든 로그를 캡처하려고합니다. 이렇게하면 작업중인 작업과 관련된 작업 중 메시지가 표시되지만 지원 코드에서 발생할 수있는 잠재적으로 나쁜 점을 알 수 있습니다. 이 파일을 콘솔과 로그 파일 모두에 보내길 원합니다. > 로그인 모든 것을 경고하고> 특정 "myprogram"로거에 대한 정보 :이 나에게 완벽한 의미가 있습니다log4net에서 중복 로깅을 제거하십시오.

<log4net> 
    <root> 
     <level value="WARN" /> 
     <appender-ref ref="Console" /> 
     <appender-ref ref="LogFile" /> 
    </root> 
    <logger name="myprogram"> 
     <level value="INFO" /> 
     <appender-ref ref="Console" /> 
     <appender-ref ref="LogFile" /> 
    </logger> 
    <appender name="Console" type="log4net.Appender.ConsoleAppender"> 
     <layout type="log4net.Layout.PatternLayout"> 
      <conversionPattern value="%message%newline" /> 
     </layout> 
     <threshold value="INFO" /> 
    </appender> 
    <appender name="LogFile" type="log4net.Appender.RollingFileAppender"> 
     <layout type="log4net.Layout.PatternLayout"> 
      <conversionPattern value="- %utcdate %level %logger %ndc %thread %message%newline" /> 
     </layout> 
     <appendToFile value="false" /> 
     <staticLogFileName value="true" /> 
     <rollingStyle value="Once" /> 
     <file value="mylogfile" /> 
     <immediateFlush value="true" /> 
     <threshold value="INFO" /> 
     <lockingModel type="log4net.Appender.FileAppender+MinimalLock" /> 
    </appender> 
</log4net> 

:

나는 다음과 같은 log4net 설정을 가지고있다.

문제는 콘솔 및 LogFile에서 두 번으로 기록 된 INFO 메시지가 표시된다는 것입니다. 이것은 <root><logger> 요소가 모두 채워진 경우에만 발생합니다. 둘 중 하나를 제거하면 나머지 하나는 예상대로 작동합니다.

myprogram이 "root"와 "myprogram"둘 다 일치하므로 WARN 항목의 이중 로그를 얻었는지 알 수 있었지만 ROOT가 WARN으로 설정되어 있더라도 INFO에서 발생합니다.

내가 여기서 뭔가 잘못하고있는 것입니까, 아니면 이것이 log4net 버그입니까? 모호한 것입니까?

답변

72

두 번 메시지를 기록 그것을 말하고 있기 때문에 당신은 중복 얻고있다. 당신은 몇 가지 부작용이 발생할 수 있기 때문에 단순히 불필요한 구성을 제거, 여기에 상가를 사용하는 것이 좋습니다 않을 것이다 : 당신은 표시 할 필요가 없습니다

<root> 
    <level value="WARN" /> 
    <appender-ref ref="Console" /> 
    <appender-ref ref="LogFile" /> 
</root> 
<logger name="myprogram"> 
    <level value="INFO" /> 
</logger> 

를 펜더-REF는 그들을 상속 때문에 로거 myprogram에서 루트 로거; 다시 지정하면 두 번 기록됩니다.

+0

동일한 문제가 발생했을 때이 기능이 잘 작동했습니다. 이것은 덧셈 문제를 피할 수 있습니다. –

+1

이것은 정답입니다. 로거는 루트에서 appender를 상속받습니다. 감사! –

+1

@Jeffrey 당신은 additivity를 사용하여 문제가 무엇인지 알고 있습니까? 나는 Google이 알고있는 문서를 찾는데 성공하지 못했습니다. – Tinister

67

가중치를 false로 설정하여이 변경을 시도하십시오.

<root> 
    <level value="WARN" /> 
    <appender-ref ref="Console" /> 
    <appender-ref ref="LogFile" /> 
</root> 
<logger name="myprogram" additivity="false"> 
    <level value="INFO" /> 
    <appender-ref ref="Console" /> 
    <appender-ref ref="LogFile" /> 
</logger> 
+1

그건 그랬어; 번들 고마워. –

+2

이것은 'myprogram'로그에 기록 된 모든 메시지를 루트 로거에 버블 링하지 않도록하는 좋은 방법입니다. – Llyle

+0

이 문제를 해결해 주셔서 감사합니다. – Kugel

관련 문제