我正在尝试设置一个公共日志库,它根据当前堆栈确定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仅返回有效记录器?
答案 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)。