99

为什么大多数 log4net 示例通过这样做来获取类的记录器:

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

而不仅仅是传递 typeof(MyClass):

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

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

4

5 回答 5

94

我想你有理由。我这样做是为了不必担心类名,只需将样板代码复制并粘贴到新类中即可。

有关官方答案,请参阅:如何在静态块中获取类的完全限定名称?在log4net 常见问题解答

于 2009-03-25T02:54:05.447 回答
8

我是 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 编写类似的东西作为扩展或静态方法,而不是将反射粘贴为我的锅炉代码的一部分:)

于 2014-09-19T02:05:37.697 回答
7

正如您所说 - 它很方便,因为您可以在不知道类名的情况下在方法中创建记录器(我知道这很简单),但允许您在类之间剪切和粘贴方法而无需重命名调用。

于 2009-03-25T02:53:30.220 回答
3

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

于 2014-08-24T09:03:46.790 回答
0

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

于 2020-06-01T22:05:09.033 回答