log4net中LogManager.GetLogger的参数

100

为什么大多数log4net示例通过执行以下操作来获取类的记录器:

private static ILog logger = 
    LogManager.GetLogger(
    System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);

不要只传递 typeof(MyClass):

private static ILog logger = LogManager.GetLogger(typeof(MyClass));

除了第一种选项不需要您键入特定的类名称之外,还有其他原因吗?

6个回答

95

我想你已经理解了原因。我这么做是为了不担心类名,并可以将模板代码复制粘贴到一个新的类中。

官方答案请参见:log4net faq 的“如何在静态块中获取类的完全限定名称?”


好的,这样就清楚了,谢谢那个链接,我之前没有看到过。 - Andy White
这是最老的代码了,但是如果你仍然将其作为模板代码,请看一下我的答案 :) - Noctis
1
你的程序没有减速,这是一个静态调用,因此每个应用程序域中每个类只有一个调用,比如如果你有 300 个类,那么在你的应用程序生命周期中最多只会有 300 次调用。 - Paul Hatcher
使用反射获取类型名称没有意义,复制/粘贴是懒惰的表现并且会影响性能,为什么不直接获取名称呢?! - MeTitus
反射(Reflection)还有一个好处,可以缩短日志信息。否则,一般的类会创建一个非常长的“记录器(Logger)”路径。 - John H
显示剩余2条评论

9

我是 NLog 用户,通常情况下可以简单描述为:

var _logger = LogManager.GetCurrentClassLogger();

在Log4Net中需要使用反射显得有些奇怪,因此我查看了NLog源代码,结果发现他们为您做了以下工作:

[MethodImpl(MethodImplOptions.NoInlining)]
public static Logger GetCurrentClassLogger()
{
    string loggerName;
    Type declaringType;
    int framesToSkip = 1;
    do
    {
#if SILVERLIGHT
        StackFrame frame = new StackTrace().GetFrame(framesToSkip);
#else
        StackFrame frame = new StackFrame(framesToSkip, false);
#endif
        var method = frame.GetMethod();
        declaringType = method.DeclaringType;
        if (declaringType == null)
        {
            loggerName = method.Name;
            break;
        }
        framesToSkip++;
        loggerName = declaringType.FullName;
    } while (declaringType.Module.Name.Equals("mscorlib.dll", StringComparison.OrdinalIgnoreCase));
    return globalFactory.GetLogger(loggerName);
}

我想,我可以编写类似的Log4Net扩展或静态方法,而不是将反射作为我的样板代码的一部分粘贴在一起 :)


7

正如你所说 - 它很方便,因为你可以在方法中创建一个日志记录器而不知道类的名称(这很琐碎),但允许你在类之间剪切和粘贴方法而无需重命名调用。


3

我认为原因在于,您可以使用.DeclaringType()方法获取运行时类型的类型。您可以在基类中使用记录器,仍然可以在记录器输出中看到对象的实际类型。这使得调查更加方便。


0

以下便携式解决方案在 .NET Core 6 中对我有效:

private static readonly ILog _log = LogManager.GetLogger(MethodBase.GetCurrentMethod()?.DeclaringType);

0

它还使得为了代码生成目的创建Codesmith模板更加容易。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接