将属性注入log4net的LoggingEvent

时间:2016-10-22 01:58:45

标签: logging log4net

我试图找到一种方法将属性注入log4net的LoggingEvent。每次通过记录方法创建事件时,例如:

log.Warn(...);
log.Info(...);
log.Error(...);

我希望能够为已创建的LoggingEvent属性添加属性。

使用反射器我可以看到,当调用日志记录方法时,如果事件的级别等于或大于记录器上设置的阈值,则它最终会实例化LoggingEvent实例。此LoggingEvent具有PropertiesDictionary类型的Properties属性,基本上是名称/值对的映射。我希望能够在没有用户进行任何额外调用的情况下向该字典添加属性。

我能想到这样做的唯一方法是,无论如何我可以包装从LogManager.GetLogger()返回的记录器。我不介意这样做,但它不能通过代码,我需要通过log4net配置实现这一点。我一直在搜索,无法通过配置找到任何方法。

我认为将线程上下文对象添加属性也是有效的,但是这必须自动发生,而无需用户通过代码执行。有没有办法让我通过配置挂钩线程上下文对象,以便每次为日志语句创建上下文时都会调用我的一些代码?

谢谢, 尼克

1 个答案:

答案 0 :(得分:0)

您似乎正在寻找log4net中的堆栈功能:stacks log4net

通过堆栈,您可以在上下文中添加信息并将其与消息一起记录:

using(log4net.ThreadContext.Stacks["NDC"].Push("context"))
{
    log.Info("Message");
}

这将添加' context'在日志输出中,您必须将其添加到日志行格式化程序中。