首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >LogManager.GetLogger的log4net参数

LogManager.GetLogger的log4net参数
EN

Stack Overflow用户
提问于 2009-03-25 02:44:54
回答 5查看 85K关注 0票数 99

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

代码语言:javascript
复制
private static ILog logger = 
    LogManager.GetLogger(
    System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);

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

代码语言:javascript
复制
private static ILog logger = LogManager.GetLogger(typeof(MyClass));

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

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2009-03-25 02:54:05

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

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

票数 94
EN

Stack Overflow用户

发布于 2014-09-19 10:05:38

我是一个NLog用户,通常可以归结为:

代码语言:javascript
复制
var _logger = LogManager.GetCurrentClassLogger();

你需要在Log4Net中使用反射,这看起来有点奇怪,所以我看了一下NLog源代码,你看,这就是他们为你做的事情:

代码语言:javascript
复制
[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编写类似的扩展或静态方法,而不是将反射粘贴到我的锅炉代码中:)

票数 8
EN

Stack Overflow用户

发布于 2009-03-25 02:53:30

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

票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/680044

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档