如何使用 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
等
如果我想使用 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
等