2013-07-19 3 views
3

Log4Net을 사용하여 데이터베이스에 예외를 기록하려고합니다. 나는 adonetappender를 사용하고 있으며 작동하지만 최적이 아닙니다. 나는이 같은 예외 매개 변수를 구성하는 경우log4net adonetAppender는 데이터베이스에 null 값을 삽입하지 않습니다.

... 그것은 삽입을 제외한 작동

<parameter> 
    <parameterName value="@exception"/> 
    <dbType value="String"/> 
    <size value="-1"/> 
    <layout type="log4net.Layout.PatternLayout"> 
    <conversionPattern value="%exception"/> 
    </layout> 
</parameter> 

은 ""대신에 널 (null)의 예외가없는 경우.

나는이처럼 만약 내가 같은 결과를 얻을 수

...

<parameter> 
    <parameterName value="@exception"/> 
    <dbType value="String"/> 
    <size value="-1"/> 
    <layout type="log4net.Layout.ExceptionLayout"> 
    <!-- <key value="exception" /> --> 
    <!--<conversionPattern value="%exception"/>--> 
    </layout> 
</parameter> 

을하지만 그것은 단지 null 값을 삽입이

<parameter> 
    <parameterName value="@exception"/> 
    <dbType value="String"/> 
    <size value="-1"/> 
    <layout type="log4net.Layout.RawPropertyLayout"> 
    <key value="exception" /> 
    </layout> 
</parameter> 

처럼이있는 경우 ...

항상 호출하는 정적 로깅 래퍼를 가지고 있기 때문에 문제가 발생할 수 있습니다.

LogManager.GetLogger("[GoodLife.Common.Logging]").Debug(message, e); // e being null if there is no exception. 

로거에서 디버그 메서드를 호출 할 때 e이 null 인 경우 null을 삽입하는 방법이 있습니까?

레이아웃에 log4net 문서는 모두 도움이되지 않습니다 내가 Default values for AdoNetAppender parameter

답변

4

문제는 예외가 속성 아니므로 log4net 키 "예외"아무것도를 찾을 수 있다는 것입니다에서 마지막 구성을 가지고 따라서 항상 null이됩니다. 문제는이 같은 자신의 레이아웃 변환기를 만들 수 있습니다 해결하기 위해

: SQL 서버를

public class RawExceptionLayout : IRawLayout 
{  
    public virtual object Format(LoggingEvent loggingEvent) 
    { 
     return loggingEvent.ExceptionObject; 
    }  
} 
+0

@Stefan에게 감사 드려요.하지만 키가 "예외"인 속성을 만드는 방법을 알면 잘 모르겠습니다. 나는 네가 맞다고 확신하지만 대답을 이해하지 못한다. –

+0

단순히 예외를 통과하는 다른 레이아웃 인 속성을 만들지 않습니다. 이 방법으로 @exception 매개 변수는 예외를 직접 가져옵니다. 나는 그것을 테스트하지 않았다는 것을 인정해야한다. 그래서 당신은 예외 (널이 아닌 경우)를 문자열로 먼저 변환해야 할 필요가있을 수있다. 그러나 이것은 알아 내기 쉬워야한다. –

+0

도움 주셔서 감사합니다. :) –

0

당신은 또한 log4net에 의해 사용 된 삽입 문을 수정할 수 있습니다 및하자 당신을 위해 일을한다. 이렇게하면 코드를 변경하지 않아도됩니다!

기본 sample config :

<commandText value="INSERT INTO Log ([Date],[Thread],[Level],[Logger],[Message],[Exception]) 
VALUES (@log_date, @thread, @log_level, @logger, @message, 
@exception)" /> 

내 수정 삽입 :

<commandText value="INSERT INTO Log ([Date],[Thread],[Level],[Logger],[Message],[Exception]) 
VALUES (@log_date, @thread, @log_level, @logger, @message, 
case when @exception &lt;&gt; '' then @exception else null end)" /> 

통지 필요한 <의 인코딩 및>는 XML에 있기 때문에!

관련 문제