2012-09-19 90 views
2

我想在使用log4net時記錄對應於日誌級別的數值。也就是說,現在我登錄到數據庫使用以下命令文本:日誌log4net數值級別值

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

    <parameter> 
    <parameterName value="@log_level" /> 
    <dbType value="String" /> 
    <size value="50" /> 
    <layout type="log4net.Layout.PatternLayout"> 
     <conversionPattern value="%level" /> 
    </layout> 
    </parameter> 

我想更改日誌記錄級別的數字的字符串值。這可能嗎?

回答

5

我沒有測試這個,但以下應該工作。

您可以創建一個這樣自己的轉換器:

sealed class NumericLevelPatternConverter : PatternLayoutConverter 
{ 
    override protected void Convert(TextWriter writer, LoggingEvent loggingEvent) 
    { 
     // maybe you need to call ToString() on the value property 
     writer.Write(loggingEvent.Level.Value); 
    } 
} 

,並在配置文件中:

<layout type="log4net.Layout.PatternLayout"> 
    <converter> 
     <name value="levelId" /> 
     <type value="YourNamespace.NumericLevelPatternConverter" /> 
    </converter> 
    <conversionPattern value="%levelId" /> 
</layout> 
+0

感謝。它工作完美。唯一的問題是我想將Converter類放在另一個項目中(所以我不必爲解決方案中的每個項目都創建一個轉換器類)。當我嘗試這樣做時,我得到一個System.TypeLoadException。有什麼辦法可以解決這個問題嗎? – olif

+1

是的,使用assemlby指定類型,例如:YourNamespace.YourType,YourAssembly。如果這仍然不起作用,您需要使用完全限定名稱,包括Version,Culture和PublicKey令牌 –

+0

再次感謝。祝你今天愉快! – olif