如何按类名检索自定义记录器并从多个位置输出实际的类名?

时间:2015-02-09 13:53:43

标签: c# .net log4net

从log4net检索记录器似乎接受以下语法:

var log = LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);

因为它避免了必须硬编码类记录的特定类型:

var log = LogManager.GetLogger(typeof(MyClass));

我确实理解这一点,并且您也可以通过匹配名称来创建自己的记录器并使用该记录器 如:

var log = LogManager.GetLogger("MyCustomLogger");

使用配置:

<logger name="MyCustomLogger">
    <level value="INFO" />
    <appender-ref ref="ColoredConsoleAppender" />
</logger>

但是,如果我在其他地方也想要检索相同的记录器,但使用不同的名称:

var log = LogManager.GetLogger("SomeOtherPlace");

我该如何处理? 我想将MyCustomLoggerSomeOtherPlace写入文件,以区别于代码中记录发生的位置。

1 个答案:

答案 0 :(得分:1)

如果您使用记录器的程序集名称,它将匹配。

由于您对LogManager.GetLogger的调用将搜索与该类的完全限定名称匹配的记录器,因此如果您根据程序集在配置名称中记录了该记录器,则可以将其与您的自定义记录器匹配。

<logger name="My.Special.Assembly">
    <level value="INFO" />
    <appender-ref ref="ColoredConsoleAppender" />
</logger>

假设上述配置,以下代码将找到并使用您的记录器

namespace My.Special.Assembly.With
{
    public class MyType
    {
        public MyType()
        {
            var log = LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);
        }
    }
}

即,log4net将通过以下调用找到记录器My.Special.Assembly:

var log = LogManager.GetLogger("My.Special.Assembly.With.MyType");