NLog GetCurrentClassLogger慢速运行方法警告:过度?

时间:2016-01-31 04:08:40

标签: logging nlog

NLog提到这个关于"慢跑"的评论,并且我已经看到其他人重复这个作为警告...好像你应该避免在使用NLog时使用GetCurrentClassLogger()

我的问题是:如果您按照建议使用NLog,从静态字段开始,这个警告被夸大了吗?它不会每种类型运行一次......不是每new个运行一次吗?

额外信用:如果这是真的,那么为了使这个警告有效,需要重复初始化静态字段?

/// <summary>
/// Gets the logger with the name of the current class.  
/// </summary>
/// <returns>The logger.</returns>
/// <remarks>This is a slow-running method. 
/// Make sure you're not doing this in a loop.</remarks>
[CLSCompliant(false)]
[MethodImpl(MethodImplOptions.NoInlining)]
public static Logger GetCurrentClassLogger()
{
    return factory.GetLogger(GetClassFullName());
}

1 个答案:

答案 0 :(得分:1)

  

NLog提到这个关于&#34;慢跑&#34;的评论,并且我已经看到其他人重复这个作为警告...好像你应该避免在使用NLog时使用GetCurrentClassLogger()

GetCurrentClassLogger的缓慢运行部分是GetClassFullName method,它会扫描StackTrace以获取当前的班级名称。这不是很慢,但也不会很快,因此通过在循环中调用StackTrace重新扫描GetCurrentClassLogger会很浪费。要明确的是,如果NLog的性能非常重要,LogManager.GetLogger("your class name")总是更快。

一般情况下,在课堂上使用GetCurrentClassLogger时不会对性能产生任何影响,即使不是static。出于性能原因,建议将其分配给静态字段。

  

我的问题是:如果您按照建议使用NLog,从静态字段开始,这个警告被夸大了吗?它不会每种类型运行一次......不是每new个运行一次吗?

TL; DR:是的,使用static字段时可以忽略此警告。 &#34;缓慢的部分&#34;确实每种类型只运行一次。

  

额外信用:如果这是真的,那么为了使这个警告有效,需要重复初始化静态字段?

不要执行此操作:

for (int i = 0; i < 100000; i++)
{
    LogManager.GetCurrentClassLogger().Trace("some cool trace");
}