2016-08-04 3 views
4

Если я хочу достичь наилучшей производительности с NLog, то я должен сделать что-нибудь в своем коде для этого?Как использовать делегат NLog LogMessageGenerator?

(Конечно, я асинхронной включен в NLog.config.)

Что об использовании делегата писать сообщения журнала?

_logger.Info(() => { return "test" }); 

К сожалению, я не мог понять, как использовать это «правильно». Это даже документировано?

_logger.Info(() => { return string.Format("msg", myParams); }); // Is that the way to go? 

ответ

3

Рекомендации, заключаются в следующем:

  • Для простой строки, просто передать его _logger.Info("test");
  • Для строки с параметрами, используйте перегруженные _logger.Info("test with {0}", "value");
  • Для дорогостоящей операции, используйте _logger.Info(() => expensiveOperation); или _logger.Info(() => {expensiveOperation()});
  • При написании расширений/оберток и т. Д. Вы также можете проверить _logger.IsInfoEnabled и т.д. перед тем, как писать
0

Если я хочу, чтобы достичь максимально возможной производительности с NLog

Целью перегрузок, которые принимают LogMessageGenerator, чтобы отложить сообщение строительства журнала.

Это может быть полезно для случаев, когда регистратор вызывается из потока, который должен быть ответственным (потоки пользовательского интерфейса или потоки HTTP-запроса являются хорошими примерами), и вы знаете, что создание конкретного сообщения журнала занимает много времени ,

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

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

_logger.Info(() => { return "test" }); 

будет медленнее, по сравнению с:

_logger.Info("test"); 

из-за накладных расходов метода вызова вместо того чтобы использовать существующую строку буквальным.

P.S.

Заметим, что лямбда-выражения, используемые для построения делегатов, можно было бы записать в более простой форме:

_logger.Info(() => "test"); 
_logger.Info(() => string.Format("msg", myParams)); 

Опять же, это не о производительности, но и о читабельности.

Смежные вопросы