2010-02-26 229 views
3

我想擴展log4net以接受自定義日誌對象作爲參數。例如:log4net自定義日誌對象和appender

 public class MyLogObject 
    { 
     public string PropA; 
     public int PropB; 
    } 

    private MyLogObject entry = new MyLogObject() {PropA = "FooBar", PropB = 1}; 
    Log.Debug(entry); 

......這應該與異常類似。

在第二步中,自定義日誌對象應該由自定義數據庫appender寫入數據庫。自定義數據庫appender將類似於ADONetAppender,但只需進行一些修改,如內部緩衝隊列的日誌條目。

有誰知道這是否適用於log4net,如果有任何例子可以幫助我如何做到這一點?

我的日誌對象和數據庫字段的屬性是固定的,所以不需要使它們可配置。

更新 我的想法是log4net的配置與自定義呈現「MyRenderer」一起使用個性化的「MyAppender」。渲染器將​​返回一個簡單的SQL插入語句,並由appender將其寫入數據庫。 也許有更好的方法來做到這一點。

回答

3

可以存儲在ThreadContext您的自定義對象(或全球範圍內,如果這是有道理的)

log4net.ThreadContext.Properties [ 「MyLogObject」] =條目;

該屬性可以很容易地在你的appender中提取。如果提供一個 「的ToString()」 覆蓋甚至可以使用它正常追加程序並指定變換圖案打印:

日期%-5level%屬性{MyLogObject} - %消息%的換行符

爲log4net創建一個接口和包裝將是一個好主意。然後,添加接受對象作爲參數的方法,以便隱藏有關設置上下文的詳細信息。

1

爲什麼不使用AdoNetAppender? appender繼承了BufferingAppenderSkeleton的內置緩衝功能。

如果您不需要將MyLogObject類的每個屬性存儲在單獨的表列中,則可以覆蓋ToString()方法。該字符串將用作log%消息%的值:

public class MyLogObject 
{ 
    public string PropA; 
    public int PropB; 

    override public string ToString() 
    { 
     return PropA + " " + PropB; 
    } 
}