Подтвердить что ты не робот

Производительность 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()));
  }

С MAXTEST значениями 100 500 1000, 5000

Результаты в MAXTEST, noLogging, Logging

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

Предполагалось, что, вероятно, никогда не запишут эту чрезмерную сумму, но это ожидалось бы от производительности?

Я также попытался использовать asyncwrapper в config

 <target name="asyncFile" xsi:type="AsyncWrapper">
   <target name="file" xsi:type="File" fileName="${basedir}/log.txt" />
 </target>

Привет

_Eric

4b9b3361

Ответ 1

Вам нужно добавить атрибут async к элементу targets:

<targets async="true">
    <target name="asyncFile" xsi:type="AsyncWrapper">
        <target name="file" xsi:type="File" fileName="${basedir}/log.txt" />
    </target>

вместо

<targets>
    <target name="asyncFile" xsi:type="AsyncWrapper">
        <target name="file" xsi:type="File" fileName="${basedir}/log.txt" />
    </target>

Думаю, я не дошел до документации, -)

Асинхронная целевая оболочка позволяет код регистратора для выполнения быстрее, путем очередности сообщений и обработки их в отдельном потоке. Вам следует обернуть цели, которые тратят нетривиальные количество времени в методе Write() с асинхронной целью для ускорения Ведение журнала. Поскольку асинхронный журнал довольно распространенный сценарий, NLog поддерживает сокращенное обозначение для обертывание всех целей AsyncWrapper. Просто добавьте async = "true" в элемент в Файл конфигурации.... ваши цели идут здесь...

Имейте в виду, что использование асинхронного ведения журнала может привести к отбрасыванию определенных сообщений. Это по дизайну.

Ответ 2

Для всех, кто должен потерять эти накладные расходы и настраивается с помощью кода, не похоже, что вы можете установить все цели на асинхронные по умолчанию - вы должны определить его для каждой цели:

// 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, чтобы вернуться к синхронному поведению.