记录的预期开销应该是多少?我试过这个例子
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
当然,人们可能永远不会记录这个过多的数量,但这会对人们所期望的性能造成影响吗?
我也尝试在配置中使用asyncwrapper
<target name="asyncFile" xsi:type="AsyncWrapper">
<target name="file" xsi:type="File" fileName="${basedir}/log.txt" />
</target>
您只需要将async
属性添加到targets
元素:
<targets async="true">
<target name="file" xsi:type="File" fileName="${basedir}/log.txt" />
代替
<targets>
<target name="asyncFile" xsi:type="AsyncWrapper">
<target name="file" xsi:type="File" fileName="${basedir}/log.txt" />
</target>
我想我没有那么深入到文档;-)
异步目标包装器允许记录器代码通过对消息进行排队并在单独的线程中处理它们来更快地执行。您应该使用异步目标在Write()方法中包含花费非常重要时间的目标来加速日志记录。由于异步日志记录是一种非常常见的情况,因此NLog支持使用AsyncWrapper包装所有目标的简写表示法。只需将async =“true”添加到配置文件中的元素即可。 ......你的目标在这里......
请记住,使用异步日志记录可能会导致丢弃某些消息。这是by design。
ref:https://github.com/nlog/NLog/wiki/AsyncWrapper-target#async-attribute-and-asyncwrapper
不要组合Async属性和AsyncWrapper。这只会减慢处理速度并且行为不可靠。
async属性是以下的简写:
xsi:type="AsyncWrapper overflowAction="Discard" queueLimit="10000" batchSize="100" timeToSleepBetweenBatches="50"
对于任何需要丢失此开销并按代码进行配置的人来说,默认情况下您可以将所有目标设置为异步 - 您必须为每个目标定义它:
// 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
以返回同步行为。