每个命名空间不同的appender

Aar*_*ell 8 log4net

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

我的配置设置如下:

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

  <logger name="MyAssembly.MyNamespace">
    <level value="WARN" />
    <!-- appender list -->
  </logger>
</log4net>
Run Code Online (Sandbox Code Playgroud)

我有一个这样的课:

namespace MyAssembly.MyNamespace.SubNamespace {
  public class MyClass { ... } 
}
Run Code Online (Sandbox Code Playgroud)

当我尝试获取ILog我传入type(var log = LogManager.GetLogger(typeof(MyClass)).Namespace);)的实例时,我希望它检测到没有配置任何记录器,因此它将在命名空间树(to MyAssembly.MyNamespace)中上升一级,然后查看是否在那一点配置.

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

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

Vin*_*jip 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>
Run Code Online (Sandbox Code Playgroud)

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