Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/batch-file/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Log4net 每个命名空间有不同的附加器_Log4net - Fatal编程技术网

Log4net 每个命名空间有不同的附加器

Log4net 每个命名空间有不同的附加器,log4net,Log4net,我正在尝试建立一个通用日志库,它根据当前堆栈确定ILog实例,并确定ILog的最佳实例 我的配置设置如下: 我有一节课是这样的: namespace MyAssembly.MyNamespace.SubNamespace{ 公共类MyClass{…} } 当我尝试获取ILog的实例时,我传入类型(var log=LogManager.GetLogger(typeof(MyClass)).Namespace)),我希望它检测到没有配置任何记录器,因此它将在名称空间树中上升一级(到MyAsse

我正在尝试建立一个通用日志库,它根据当前堆栈确定
ILog
实例,并确定ILog的最佳实例

我的配置设置如下:


我有一节课是这样的:

namespace MyAssembly.MyNamespace.SubNamespace{
公共类MyClass{…}
}
当我尝试获取
ILog
的实例时,我传入类型(
var log=LogManager.GetLogger(typeof(MyClass)).Namespace)),我希望它检测到没有配置任何记录器,因此它将在名称空间树中上升一级(到
MyAssembly.MyNamespace
),然后查看是否在该点配置它

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


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

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

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

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

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


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

也许记录器实例的依赖项注入将是一个更好的设计?@Mitch-Wheat:True使用MEF之类的工具会很好,但我们有一个无DI的实现,我只是在尝试调整