代码之家  ›  专栏  ›  技术社区  ›  Eric

NLog性能

  •  46
  • Eric  · 技术社区  · 15 年前

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

     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()));
      }
    

    试验值为1005000,最大值为5005000

    结果是MAXTEST,noLogging,Logging

    100,  25ms, 186ms    
    500,  33ms, 812ms    
    1000, 33ms, 1554ms
    5000, 33ms, 7654ms
    

    当然,一个人可能永远不会记录这个过多的数量,但这是一个预期的性能下降?

    我还尝试在配置中使用异步包装器

     <target name="asyncFile" xsi:type="AsyncWrapper">
       <target name="file" xsi:type="File" fileName="${basedir}/log.txt" />
     </target>
    
    2 回复  |  直到 8 年前
        1
  •  88
  •   ROY    8 年前

    你只需要添加 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>
    

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

    异步目标包装器允许 更快速执行的记录器代码, 通过对消息进行排队和处理 包装那些花费不小的 用异步目标加速 登录中。因为异步日志记录 支持的速记符号 用包装所有目标 异步包装器。只需将async=“true”添加到 中的元素 ...

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


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

    Async属性和AsyncWrapper

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

    Async attribute will discard by default

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

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

        2
  •  20
  •   Rob Church    13 年前

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