每个命名空间不同的appender

时间:2009-07-23 00:01:06

标签: log4net

我正在尝试设置一个公共日志库,它根据当前堆栈确定ILog实例,以及使用ILog的最佳实例。

我的配置设置如下:

<log4net>
  <!-- appenders omitted -->
  <root></root>

  <logger name="MyAssembly.MyNamespace">
    <level value="WARN" />
    <!-- appender list -->
  </logger>
</log4net>

我有一个这样的课:

namespace MyAssembly.MyNamespace.SubNamespace {
  public class MyClass { ... } 
}

当我尝试获取ILog的实例时,我传入了类型(var log = LogManager.GetLogger(typeof(MyClass)).Namespace);)并且我希望它检测到没有配置任何记录器,所以它会上升一个命名空间树中的级别(到MyAssembly.MyNamespace),然后查看它是否在该点配置。

问题是为ILog返回的MyAssembly.MyNamespace.SubNamespace是为WARN事件(及以上)配置的,基本上是我为其父配置的。当所需名称包含定义的名称时,Log4net似乎返回ILog,而不是等于名称。

当名称与配置中定义的名称相同时,如何让Log4net仅返回有效记录器?

1 个答案:

答案 0 :(得分:10)

log4net根据名称将记录器视为层次结构中存在的记录器,因此名为MyAssembly.MyNamespace.SubNamespace的记录器是名为MyAssembly.MyNamespace的记录器的子项。

如果没有为记录器指定级别(WARN等),系统将遍历记录器层次结构,直到找到具有已配置级别的记录器 - 并且该记录器将成为该记录器的有效级别。

在您的情况下,子记录器没有指定级别,因此它继承了其父级别的级别 - WARN。如果您指定

<logger name="MyAssembly.MyNamespace.SubNamespace">
    <level value="DEBUG" /> <!-- or whatever -->
    <!-- no need to specify appenders, will use parent's -->
</logger>

然后您将从子记录器获得DEBUG输出(发送到为父组件配置的appender)。