如何通过 class 名称检索我的自定义记录器并从多个位置输出实际的 class 名称?

How do I retrieve my custom logger by class name and output the actual class name from multiple places?

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

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

因为它避免了对 class 日志记录的特定类型进行硬编码:

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 写入文件,以区分日志记录发生在代码中的位置。

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

由于您对 LogManager.GetLogger 的调用将搜索与 class 的完全限定名称匹配的记录器,如果您在配置中根据记录器命名,则可以将其与您的自定义记录器匹配到大会。

<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");