2016-10-22 97 views
0

我试图找出一种方法将属性注入到log4net的LoggingEvent中。每经测井方法创建一个事件时,如:将属性注入到log4net的LoggingEvent中

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

我希望能够将属性添加到所创建的LoggingEvent所,属性属性。

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

我能想到这样做的唯一方法是如果我以某种方式包装从LogManager.GetLogger()返回的记录器。我不介意这样做,但它不能通过代码,我需要通过log4net配置来实现。我一直在四处搜寻,看不到任何通过配置来包装东西的方式。

我认为它也可以将属性添加到线程上下文对象中,但是这又必须自动发生,而不需要用户通过代码来完成。有没有办法让我通过配置挂钩到线程上下文对象,这样每次为日志语句创建上下文时,我的一些代码就会被调用?

感谢, 尼克

回答

0

看来你正在寻找的堆栈功能在log4net的:stacks log4net

堆栈使您能够在上下文中添加信息,并与您的邮件记录它:

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

这会在日志输出中添加“上下文”,您必须将其添加到日志行格式化程序中。

+0

不,这不会工作,因为用户必须编码。我正在寻找一种方法让我注入我自己的代码,以便每次创建LoggingEvent时都可以为其添加属性。 – nickdu