LogManager.GetLogger的log4net参数

时间:2009-03-25 02:44:54

标签: log4net

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

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

而不是仅传递typeof(MyClass):

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

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

5 个答案:

答案 0 :(得分:91)

我认为你有理由。我这样做,所以我不必担心类名,只需将锅炉板代码复制并粘贴到新类中。

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

答案 1 :(得分:7)

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

答案 2 :(得分:7)

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

答案 3 :(得分:3)

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

答案 4 :(得分:0)

这也使创建用于代码生成目的的Codesmith模板更加容易。