2014-10-20 40 views
0

我想在使用c#的日誌中添加一些自定義字段。當我知道所有的領域時,我能夠做到這一點。在c中動態添加使用Log4Net的自定義字段#

現在,在一種情況下,我不知道字段的數量。例如。我必須添加對象的參數,並且在運行期間對象的數量會不斷變化,我需要根據對象的數量添加字段。

是否有任何調整可以在log4net完成這一點,所以每當有新的對象創建新的字段。

我不確定主要是如何在log4net的配置文件中處理這個問題。

回答

1

您可以在custom property爲log4net的添加對象的屬性和日誌屬性的內容在您的格式:

例如,在你的代碼:

log4net.ThreadContext.Properties[ "myObjectProperties" ] = obj.prop1 + " " obj.prop2; // + ...; 

,並在配置:

<conversionPattern value="%logger (%property{myObjectProperties}) [%level]- %message%newline" /> 

您不能擁有一個即時可配置的模式;你可以有多種模式來匹配不同的對象,但這不會很容易管理。

編輯:好了,你可以有一個運行時配置的模式,但不原生地:)不過你也許可以有一個模式是能夠從上述性能的加載

2日編輯:如果有多達4000和性能需要,爲什麼不考慮任何推動所有這些屬性,消息本身(log.Info(myObject.ToString()))的一部分,或者創建自定義的appender,將能夠處理一個特定的接口來處理:

public interface IHaveManyFieldsToLog 
{ 
    public string[] GetAllPropertyValues() 
} 

public class ManyFieldsToLogAppender: SkeletonAppender 
{ 
    // pseudocode, I don't have the IDE at the moment 
    public override AppendLog(LogEvent event) 
    { 
     if (event.Parameter[0] as IHaveManyFieldsToLog != null) 
     { 
       var values = (event.Parameter[0] as IHaveManyFieldsToLog).GetAllPropertyValues(); 
       // concat all values and push it to the log 
     } 
    } 
} 
+0

確定,但其匹配我想我的要求。它就像我想要添加5000個名稱爲動態的值,並在應用程序運行時設置。在log4net.config中,我們通常使用這些名稱,但有什麼辦法可以將這些動態設置爲5000個值不可行 – NitinG 2014-10-28 05:14:23

+0

如果值來自對象,則可能需要重寫ToString方法(或其他常用方法,例如來自接口),它將轉儲每種類型對象的特定值。記錄方法輸出,或者創建一個自定義appender,以自定義的方式處理這些對象。見第二編輯 – samy 2014-10-28 07:48:45

+0

非常感謝。我已經覆蓋了PatternLayout類並相應地推送了所有這些屬性和值。在開始時看起來很體面,但讓我們看看它是如何移動的,因爲我需要在其中實施複雜的東西。 – NitinG 2014-10-28 08:16:11

相關問題