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());
}
答案 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");
}