如何使用 NLog LogMessageGenerator 委托?

How to use the NLog LogMessageGenerator delegate?

如果我想使用 NLog 实现 最佳性能 我应该在我的代码中做些什么来实现这个目标?

(当然,我在 NLog.config 中启用了异步。)

使用委托来写日志消息怎么样?

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

不幸的是,我不知道如何使用它 "properly"。这甚至有记录吗?

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

If I want to achieve best possible performance with NLog

接受 LogMessageGenerator 的重载的目的是推迟日志消息构造。

这对于以下情况很有用,当从线程调用记录器时,需要高度负责(UI 线程或 HTTP 请求线程是很好的例子),你知道,构建特定的日志消息很耗时。

使用这些重载和异步日志记录,NLog 将 return 尽快控制调用方,稍后将在后台线程上执行传递的委托。

就这些了
我的意思是,到处传递委托 不会 使您的或 NLog 代码 更快 。而且,这个:

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

,与:

相比
_logger.Info("test");

因为方法调用开销而不是使用现有的字符串文字。

P.S.

请注意,用于构造委托的 lambda 表达式可以用更简单的方式编写:

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

同样,这与性能无关,而是与可读性有关。

建议如下:

  • 对于普通字符串,直接传递即可_logger.Info("test");
  • 对于带参数的字符串,使用重载_logger.Info("test with {0}", "value");
  • 对于昂贵的操作,使用 _logger.Info(() => expensiveOperation);_logger.Info(() => {expensiveOperation()});
  • 写extensions/wrappers等的时候也可以在写
  • 之前检查_logger.IsInfoEnabled