我正在尝试建立一个公共日志库,它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).
| 归档时间: |
|
| 查看次数: |
9389 次 |
| 最近记录: |