log4net自定义日志对象和appender

时间:2010-02-26 15:10:26

标签: c# .net logging log4net

我想扩展log4net以接受自定义日志对象作为参数。例如:

        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以使用我的自定义“MyAppender”和自定义渲染器“MyRenderer”。渲染器将​​返回一个简单的SQL-insert语句,并由appender写入数据库。 也许有更好的方法来做到这一点。

2 个答案:

答案 0 :(得分:3)

您可以将自定义对象存储在ThreadContext(或全局上下文中,如果有意义的话)

  

log4net.ThreadContext.Properties [“MyLogObject”] =条目;

可以在appender中轻松提取属性。如果您提供“ToString()”覆盖,您甚至可以使用普通的appender打印它并指定转换模式:

  

日期%-5level%属性{MyLogObject} - %message%newline

为log4net创建接口和包装器是个好主意。然后添加接受对象作为参数的方法,以便隐藏有关设置上下文的详细信息。

答案 1 :(得分:1)

为什么不使用AdoNetAppender? appender继承了BufferingAppenderSkeleton的内置缓冲功能。

如果您不需要将MyLogObject类的每个属性存储在单独的表列中,则可以覆盖ToString()方法。该字符串将用作日志%消息%:

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

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