2013-07-19 88 views
3

我想用Log4Net將異常記錄到數據庫中。我正在使用adonetappender,它確實有效,但並非最佳。log4net adonetAppender不會將空值插入到數據庫中

如果我設置這樣的例外參數...

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

它的工作原理,但插入「」當存在而不是空也不例外。

我得到同樣的結果,如果我有這樣的...

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

但是,如果我有像這樣

<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爲空,我有沒有辦法讓它插入空值?

的佈局log4net的文檔是不是所有的有益的,我從Default values for AdoNetAppender parameter

回答

4

的問題是,異常是不是財產,因此log4net的無法找到關鍵「異常」東西拿到了最後的配置因此你總是空。

爲了解決你的問題,你可以創建自己的佈局轉換器是這樣的:

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

謝謝@Stefan,但我不確定我是否看到如何使用鍵「異常」創建屬性。我相信你是對的,但我不明白答案。 –

+0

它不創建屬性,它是一種簡單地通過異常的不同佈局。這樣@exception參數直接得到異常。我不得不承認我沒有對它進行測試,因此可能需要先將異常(如果不爲空)轉換爲字符串,但這應該很容易理解。 –

+0

感謝您的幫助。 :) –

0

您還可以通過log4net的修改使用INSERT語句,讓SQL服務器做的工作適合你。這具有不需要更改代碼的好處!

默認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!

相關問題