NLog性能

Eri*_*ric 47 c# logging 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()));
  }
Run Code Online (Sandbox Code Playgroud)

MAXTEST值为100,500,1000,5000

结果为MAXTEST,noLogging,Logging

100,  25ms, 186ms    
500,  33ms, 812ms    
1000, 33ms, 1554ms
5000, 33ms, 7654ms
Run Code Online (Sandbox Code Playgroud)

当然,人们可能永远不会记录这个过多的数量,但是这会对人们所期望的性能造成影响吗?

我也尝试在配置中使用asyncwrapper

 <target name="asyncFile" xsi:type="AsyncWrapper">
   <target name="file" xsi:type="File" fileName="${basedir}/log.txt" />
 </target>
Run Code Online (Sandbox Code Playgroud)

Eri*_*ric 85

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

<targets async="true">
        <target name="file" xsi:type="File" fileName="${basedir}/log.txt" />
Run Code Online (Sandbox Code Playgroud)

代替

<targets>
    <target name="asyncFile" xsi:type="AsyncWrapper">
        <target name="file" xsi:type="File" fileName="${basedir}/log.txt" />
    </target>
Run Code Online (Sandbox Code Playgroud)

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

异步目标包装器允许记录器代码通过对消息进行排队并在单独的线程中处理它们来更快地执行.您应该使用异步目标在Write()方法中包含花费非常重要时间的目标来加速日志记录.由于异步日志记录是一种非常常见的情况,因此NLog支持使用AsyncWrapper包装所有目标的简写表示法.只需将async ="true"添加到配置文件中的元素即可.......你的目标在这里......

请记住,使用异步日志记录可能会导致丢弃某些​​消息.这是设计的.


ref:https://github.com/nlog/NLog/wiki/AsyncWrapper-target#async-attribute-and-asyncwrapper

异步属性和AsyncWrapper

不要组合Async属性和AsyncWrapper.这只会减慢处理速度并且行为不可靠.

默认情况下,Async属性将被丢弃

async属性是以下的简写:

xsi:type="AsyncWrapper overflowAction="Discard" queueLimit="10000" batchSize="100" timeToSleepBetweenBatches="50"

  • 最终记录为5000,大约为44毫秒.问候 (31认同)
  • 这个答案现在显示了一个不好的做法,不建议同时使用AsyncWrapper和async = true https://github.com/nlog/NLog/wiki/AsyncWrapper-target#async-attribute-and-asyncwrapper (7认同)
  • 这有多大的不同?您可以将时间与第一组结果进行比较吗? (4认同)

Rob*_*rch 19

对于任何需要丢失此开销并按代码进行配置的人来说,默认情况下您可以将所有目标设置为异步 - 您必须为每个目标定义它:

// 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);
Run Code Online (Sandbox Code Playgroud)

请注意,默认情况下,如果排队太多日志项,它只会删除项目 - 请查看OverflowAction = AsyncTargetWrapperOverflowAction.Block返回同步行为.

  • 如果要备份日志记录,也要警惕`AsyncTargetWrapperOverflowAction.Block`,那么很可能您的系统可能已经受到压力.强制日志记录阻止将进一步妨碍您的性能.删除日志消息可能比停止处理请求更好. (2认同)