Производительность NLog - PullRequest
       4

Производительность NLog

47 голосов
/ 06 октября 2010

Какими должны быть ожидаемые издержки при ведении журнала? Я попробовал этот пример

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

При максимальных значениях 100 500 000, 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>

Ответы [ 2 ]

84 голосов
/ 06 октября 2010

Вам нужно только добавить атрибут 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" в элемент в конфигурационный файл. ... ваши цели идут сюда ...

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


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

Атрибут Async и AsyncWrapper

Не объединяйте атрибут Async и AsyncWrapper. Это только замедлит обработку и будет вести себя ненадежно.

Атрибут Async по умолчанию удаляется

Атрибут async является сокращением для:

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

19 голосов
/ 08 февраля 2013

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

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

...