NLog性能

预期的开销是什么? 我试过这个例子

private class Person { private static Logger logger = LogManager.GetCurrentClassLogger(); public string Name { get; private set; } public Person(string name) { Name = name; logger.Info("New person created with name {0}", name); } } List<Person> people = new List<Person>(); for (int i = 0; i < MAXTEST; i++) { people.Add(new Person(i.ToString())); } 

MAXTEST值为100,500,1000,5000

结果在MAXTEST,noLogging,logging

 100, 25ms, 186ms 500, 33ms, 812ms 1000, 33ms, 1554ms 5000, 33ms, 7654ms 

当然,人们可能永远不会logging这个过量的数量,但是这个性能会如何呢?

我也尝试在configuration中使用asyncwrapper

  <target name="asyncFile" xsi:type="AsyncWrapper"> <target name="file" xsi:type="File" fileName="${basedir}/log.txt" /> </target> 

问候

_Eric

您只需要将async属性添加到您的targets元素:

 <targets async="true"> <target name="asyncFile" xsi:type="AsyncWrapper"> <target name="file" xsi:type="File" fileName="${basedir}/log.txt" /> </target> 

代替

 <targets> <target name="asyncFile" xsi:type="AsyncWrapper"> <target name="file" xsi:type="File" fileName="${basedir}/log.txt" /> </target> 

我想我没有得到那么深的文件;-)

asynchronous目标包装允许logging器代码更快速地执行,方法是将消息排队并在单独的线程中处理它们。 您应该将具有asynchronous目标的目标花费在不重要的时间量的Write()方法中,以加快日志logging速度。 由于asynchronous日志logging是相当常见的情况,NLog支持用AsyncWrapper封装所有目标的简写符号。 只要将async =“true”添加到configuration文件中的元素即可。 你的目标是这里

请记住,使用asynchronous日志logging可能会导致某些消息被丢弃。 这是devise 。

对于任何需要失去这种开销并且正在通过代码进行configuration的人来说,默认情况下,您不会将所有目标设置为asynchronous – 您必须定义每个目标:

 // Set up asynchronous database logging assuming dbTarget is your existing target AsyncTargetWrapper asyncWrapper = new AsyncTargetWrapper(dbTarget); config.AddTarget("async", asyncWrapper); // Define rules LoggingRule rule1 = new LoggingRule("*", LogLevel.Trace, asyncWrapper); config.LoggingRules.Add(rule1); 

要小心,默认情况下,如果你排队太多的日志项目,它会放弃项目 – 看看OverflowAction = AsyncTargetWrapperOverflowAction.Block回到同步行为。