代码之家  ›  专栏  ›  技术社区  ›  Alexander

log4net自定义日志对象和附加器

  •  3
  • Alexander  · 技术社区  · 14 年前

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

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

    …这应该与例外情况类似。

    在第二步中,自定义日志对象应该由自定义数据库附加器写入数据库。自定义的数据库附加器将类似于ADOMAppender,但有一些修改,如内部缓冲的日志条目队列。

    有人知道这是否适用于log4net,如果有任何例子可以帮助我怎么做?

    我的日志对象和数据库字段的属性是固定的,因此不需要配置它们。

    更新 我的想法是配置log4net使用我的自定义“myappender”和自定义渲染器“my renderer”。渲染器将返回一个简单的SQL INSERT语句,该语句由附加器写入数据库。 也许有更好的方法。

    2 回复  |  直到 14 年前
        1
  •  3
  •   Stefan Egli    14 年前

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

    log4net.threadcontext.properties[“mylogobject”]=条目;

    属性可以很容易地在附加器中提取。如果提供“toString()”覆盖,甚至可以使用普通附加器打印它并指定转换模式:

    日期%-5级别%属性MyLogObject-%消息%newline

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

        2
  •  1
  •   Peter Lillevold Rene    14 年前

    为什么不使用ADOMAppender?附加器从继承内置缓冲功能 BufferingAppenderSkeleton .

    如果不需要存储 MyLogObject 在单独的表列中,可以重写 ToString() 方法。该字符串将用作日志%message%的值:

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