我想扩展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写入数据库。 也许有更好的方法来做到这一点。
答案 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;
}
}