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
回到同步行为。