如何使用NLog LogMessageGenerator委托

本文关键字:委托 LogMessageGenerator NLog 何使用 | 更新日期: 2023-09-27 18:00:12

如果我想用NLog实现尽可能好的性能,我的代码中应该做些什么来实现这一点吗?

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

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

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

不幸的是,我不知道如何"正确"使用这个。这有记录吗?

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

如何使用NLog LogMessageGenerator委托

建议如下:

  • 对于普通字符串,只需将其传递给_logger.Info("test");
  • 对于带有参数的字符串,请使用重载_logger.Info("test with {0}", "value");
  • 对于昂贵的操作,请使用_logger.Info(() => expensiveOperation);_logger.Info(() => {expensiveOperation()});
  • 在编写扩展/包装等时,您也可以在编写前检查_logger.IsInfoEnabled

如果我想用NLog 实现尽可能好的性能

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

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

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

仅此而已
我的意思是,在这里和那里传递委托不会使您的或NLog代码更快。此外,这个:

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

,与相比

_logger.Info("test");

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

第页。S.

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

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

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