56

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

 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>
4

2 回答 2

98

您只需要将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" 添加到配置文件中的元素即可。...你的目标在这里...

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


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

异步属性和 AsyncWrapper

不要将 Async 属性和 AsyncWrapper 结合使用。这只会减慢处理速度并且行为不可靠。

默认情况下,异步属性将丢弃

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

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

于 2010-10-05T23:53:12.923 回答
23

对于需要失去这种开销并通过代码进行配置的任何人,默认情况下您似乎无法将所有目标设置为异步 - 您必须为每个目标定义它:

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

于 2013-02-08T16:10:26.853 回答