C# 非直瞄性能

C# 非直瞄性能,c#,logging,nlog,C#,Logging,Nlog,日志记录的预期开销应该是多少? 我试过这个例子 私人阶级人士 { 私有静态记录器Logger=LogManager.GetCurrentClassLogger(); 公共字符串名称{get;private set;} 公众人物(字符串名称) { 名称=名称; Info(“使用名称{0}创建的新人员”,名称); } } 列表人员=新列表(); 对于(int i=0;i

日志记录的预期开销应该是多少? 我试过这个例子

私人阶级人士
{
私有静态记录器Logger=LogManager.GetCurrentClassLogger();
公共字符串名称{get;private set;}
公众人物(字符串名称)
{
名称=名称;
Info(“使用名称{0}创建的新人员”,名称);
}
}
列表人员=新列表();
对于(int i=0;i
最大测试值为10050010005000

MAXTEST、noLogging和Logging中的结果

100,  25ms, 186ms    
500,  33ms, 812ms    
1000, 33ms, 1554ms
5000, 33ms, 7654ms
虽然人们可能永远不会记录这么多的日志,但这是否是人们所期望的性能呢

我还尝试在配置中使用asyncwrapper


您只需将
async
属性添加到
目标
元素:


而不是


我想我没有深入到文档中;-)

异步目标包装器允许 记录器代码以更快地执行, 通过对消息进行排队和处理 他们在一个单独的线程。你应该 包装花费大量时间的目标 其Write()方法中的时间量 使用异步目标加速 登录中。因为异步日志记录 这是很常见的情况,NLog 支持的简写符号 将所有目标包装为 异步包装器。只需将async=“true”添加到 中的元素 配置文件。。。你的目标在这里 ...

请记住,使用异步日志记录可能会导致某些消息被丢弃。这是


参考:

异步属性和异步包装器 不要将Async属性和AsyncWrapper组合在一起。这只会减慢处理速度,并且行为不可靠

async属性是以下内容的简写:


xsi:type=“AsyncWrapper overflowAction=“Discard”queueLimit=“10000”batchSize=“100”TimeToSleepBetweenBatchs=“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=AsyncTargetTrapperOverflowAction.Block
,以返回同步行为。

这会产生多大的差异?您可以发布时间以与第一组结果进行比较吗?使用logg时,5000的结果为~44msing.Regard如果您添加
而不是例如
,则您将不再具有
异步文件
目标。我已编辑了您的答案以澄清这一点。此答案现在显示了一种不好的做法,如果您同时输入大量消息,则不建议同时使用async=true的AsyncWrapper,默认情况下为NLog async w我将丢弃邮件。简单地说,中详细介绍了防止邮件丢失的正确方法,即使用AsyncWrapper并将overflowAction设置为Block或Grow。这就是我一直在寻找的内容,并感谢对overflowAction的了解。另外,请小心
AsyncTargetTrapperOverflowAction。Block
如果您正在备份日志记录,那么它就是您的系统可能已经有压力。强制阻止日志记录将进一步影响您的性能。删除日志消息可能比停止处理请求更好。我正在向目标数据库写入数据。在我的
目标
部分中,我已将
异步
标记为
。我还需要编写代码吗要使日志记录异步,请与我的web服务联系,否则framework会处理它?@Sameer您可以这样做。您已经阅读了足够多的文档,并且已经使用了快捷方式async=“true”Wiki: