当前位置:  开发笔记 > 编程语言 > 正文

LogManager.GetLogger的log4net参数

如何解决《LogManager.GetLogger的log4net参数》经验,为你挑选了3个好方法。

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

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

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

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

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



1> Steven Lyons..:

我想你有理由.我这样做,所以我不必担心类名,只需在一个新类中复制和粘贴样板代码.

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



2> Preet Sangha..:

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



3> Noctis..:

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

推荐阅读
mobiledu2402851323
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有