2010-02-26 223 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; 
    } 
}