Log4net 记录器级别的上下文范围

Log4net 记录器级别的上下文范围,log4net,log4net-configuration,Log4net,Log4net Configuration,有没有办法在log4net的记录器级别设置上下文属性值?我们在线程上下文和全局上下文中都有作用域,等等。我想知道是否有办法在记录器实例级别设置上下文变量 我知道这样的事情是不存在的,但我想说的是 private static ILog _Log = LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType); _Log.LoggerContext.Properties["myVar"]

有没有办法在log4net的记录器级别设置上下文属性值?我们在线程上下文和全局上下文中都有作用域,等等。我想知道是否有办法在记录器实例级别设置上下文变量

我知道这样的事情是不存在的,但我想说的是

 private static ILog _Log = LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);

_Log.LoggerContext.Properties["myVar"] = "someValue";
//now every log with this logger will use somevalue for the myVar property.

有没有办法做到这一点?

据我所知,log4net(或NLog)中不存在这种功能。我确实有一个想法,应该是可行的。我不知道这是不是一个“好”的主意,我会留给你来决定

简单地说,您可以编写一个定制的PatternLayoutConverter()。此转换器将在您自己的静态字典中查找“上下文”(类似于log4net已有的静态字典上下文)。“上下文”将按记录器名称存储。字典中的值将是另一个保存变量的字典

这比我现在准备讨论的要复杂一点,但我会尝试给出一些好的伪代码来展示它是如何工作的

更新:

我添加了一个有效的实现(至少在我所做的最小测试中)。我已经定义了一个“上下文”来为每个记录器保存一个属性包。我还实现了PatternLayoutConverter来检索给定记录器的属性

(代码格式似乎不符合缩进)

输出:

A: 2011-07-19 10:17:07,932 [1] A DEBUG [LOGPROP = abc] Hello from A
B: 2011-07-19 10:17:07,963 [1] B DEBUG [LOGPROP = def] Hello from B
C: 2011-07-19 10:17:07,963 [1] C DEBUG [LOGPROP = ghi] Hello from C
祝你好运

<appender name="debug" type="log4net.Appender.DebugAppender">
  <layout type="log4net.Layout.PatternLayout">
    <param name="ConversionPattern" value="%d [%t] %logger %-5p [LOGPROP = %LOGPROP{test}] %m%n"/>
    <converter>
      <name value="LOGPROP" />
      <type value="Log4NetTest.LoggerContextPropertiesPatternConverter" />
    </converter>
  </layout>
</appender>
  ILog loga = LogManager.GetLogger("A");
  ILog logb = LogManager.GetLogger("B");
  ILog logc = LogManager.GetLogger("C");

  LoggerProperties.Properties[loga]["test"] = "abc";
  LoggerProperties.Properties[logb]["test"] = "def";
  LoggerProperties.Properties[logc]["test"] = "ghi";

  loga.Debug("Hello from A");
  logb.Debug("Hello from B");
  logc.Debug("Hello from C");
A: 2011-07-19 10:17:07,932 [1] A DEBUG [LOGPROP = abc] Hello from A
B: 2011-07-19 10:17:07,963 [1] B DEBUG [LOGPROP = def] Hello from B
C: 2011-07-19 10:17:07,963 [1] C DEBUG [LOGPROP = ghi] Hello from C