2009-07-23 45 views
8

我想设置一个通用的日志库,它决定了基于当前堆栈的ILog实例以及什么是最佳的ILog实例。每个命名空间的不同appenders

我有我的配置设置如下:

<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),然后查看它是否在该点配置。

问题是ILogMyAssembly.MyNamespace.SubNamespace返回配置WARN事件(及以上),本质上是我配置它的父母。 Log4net似乎在返回ILog时所需的名称包含的一个定义的名称,而不是当它的等于的名称。

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

+0

也许依赖注入记录器实例会是一个更好的设计? – 2009-07-23 01:02:13

回答

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)。