LogManager的log4net参数


98

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

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

而不只是传递typeof(MyClass):

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

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

Answers:


93

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

有关官方答案,请参见:如何在静态块中获得类的全名?在log4net常见问题上


好的,这已经清除了,感谢您的链接,我之前从未见过
Andy White 2009年

这已经变老了,但是如果您仍将其粘贴为锅炉代码,请看一下我的回答:)
Noctis 2014年

您确实节省了一点开发时间,只需剪切和粘贴此代码即可。但是,与使用字符串常量或调用'typeof()'相比,调用'GetCurrentMethod()'会产生成本。如果您将在代码的整个生命周期中调用该代码的次数与键入类名所需的时间相加,那么,我认为您只是在放慢代码的速度,就没有多大好处。
Youngs'Feb

1
你不放慢不亚于你认为,这是一个静态调用,这样你每次应用领域,例如,每一个类调用,如果你有你有你的应用程序的生命周期最多300个电话本300班
保罗孵化器

使用反射来获取类型名称毫无意义,而复制/粘贴是懒惰,会导致性能下降,那么为什么不只获取名称呢?
MeTitus

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


7

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


3

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


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.