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