2016-09-26 4 views
0

내 WinForms 애플리케이션 로그인에 log4net api를 사용하고 있습니다. RollingFileAppender와 TextBoxAppender (custom appender)라는 다중 appenders가 있습니다.일부 애펜더에게만 log4net 로그 메시지가 표시됩니다.

일부 오류 메시지는 로그 파일 (RollingFileAppender)에만 기록하고 텍스트 상자 (TextBoxAppender)에는 기록하지 않으려 고합니다. 그것을 어떻게 성취 할 수 있습니까? 메시지가 동일한 레벨, 즉 모든 오류 메시지임을 유의하십시오.

감사합니다.

편집 1 :

는 특히, 난 단지 로그 파일에 간단한 UI에서 한 줄의 오류 메시지뿐만 아니라 로그 파일하지만 스택 추적을 표시합니다. 여기

당신이 기준으로 필터링 할 수 있습니다

+1

을 당신이 비록 * * F의 적절한 응용 프로그램을 통해 (한 로거하여이 작업을 수행 할 수 있습니다 ilters) 이것은 log4net의 영향을받습니다. 당신이 일반적으로하고 싶은 것은 각각의 설정에 대해 분리 된 로거를 사용하고 적절한 로거에 appenders를 추가하는 것입니다 ('FileLogger','UILogger','UniversalLogger' 같은 것). 로거는 appender를 공유 할 수 있습니다. –

+0

별도의 로거를 사용하더라도 동일한 수준의 메시지 (예 : 로그 수준 오류 메시지 중 일부는 UILogger에 표시됨)와 일부 로그 수준 오류 메시지 (예 : 표시되지 않음)를 필터링 할 수 있습니다. 기본적으로 당신이 제안하는 것은 logger1.Error()와 logger2.Error()와 같이 필요에 따라 두 로거를 호출해야 할 필요가있는 모든 장소입니다. – AllSolutions

+0

여러 로거 인스턴스를 사용하여 보낼 곳이 좋을 수도 있습니다. 로그 메시지는 오직 1 개의 목적지로만 보내지 만 대다수의 경우 메시지는 로거 양쪽 모두로 전송되어야합니다 – AllSolutions

답변

2

실제로 이해할 수 있듯이 메시지는 두 appenders로 이동하지만 그 중 하나만 스택 추적을 기록합니다.

logger.Error($"Something went wrong frobbing the widget: {ex.Message}", ex); 

그런 다음 log4net을 말함으로써 스택 추적을 생략 일부는 여러 펜더를 사용할 수 있습니다 로거는 우리가 예외를 돌봐 수 있습니다 : 첫째, Exception.ToString() 사용하지 않는 예외로 예외를 포함하는 메시지를 기록 (실제로 그들과 함께 아무 일도하지에 의한) : 자세한 내용과

<appender name="TextBoxAppender" type="MyAppenders.TextBoxAppender"> 
    <layout type="log4net.Layout.PatternLayout"> 
     <ignoresException value="false" /> 
     <conversionPattern value="%m%n" /> 
    </layout> 
</appender> 

그리고 다른 사람 :

<appender name="FileAppender" type="log4net.Appender.RollingFileAppender"> 
    ... 
    <layout type="log4net.Layout.PatternLayout"> 
     <conversionPattern value="%d{ISO8601} [%t] %-5p %c - %m%n" /> 
    </layout> 
</appender> 
+0

TextBoxAppender의 경우 ignoresException을 true로 설정하고 코드를 logger.Error ("Stack Trace :", ex);로 변경했습니다. 여전히 텍스트 상자에 스택 추적이 표시됩니다. 내가 놓친 게 무엇입니까? 내 전환 패턴은 다음과 같습니다. AllSolutions

+0

아, 혼란 스럽네. 'ignoresException'은 레이아웃을 가리키는 *가 예외를 처리하고 있음을 나타 내기 위해'false' 여야합니다. –

+0

Ok 예 :)이를 false로 설정하면 UI에서 스택 추적을 표시하지 않을 수 있습니다. 하지만 내 코드는 : logger.Error ("Stack Trace :", ex); UI에 "스택 추적"이라는 단어가 표시됩니다. UI에 아무 것도 표시하지 않으려면 첫 번째 매개 변수에서 무엇을 전달해야합니까? – AllSolutions

1

다른 펜더에 출력 다른 메시지에 대한 해결 방법은이 ForwardingAppender (https://logging.apache.org/log4net/release/sdk/log4net.Appender.ForwardingAppender.html logging.apache의 문서는 현재 아래 것 같다,하지만 어쨌든 여기 링크입니다)해야한다 로그 메시지를 기반으로합니다 (http://www.codeproject.com/Articles/140911/log-net-Tutorial, 단락 "StringMatchFilter").

적어도 하나의 특정 Appender로이 메시지를 가져 오는 데 도움이됩니다. stacktrace를 생략하는 방법을 확인하십시오. Jeroen Mosterts가 대답을 참조하십시오.

관련 문제