如何使用NLog LogMessageGenerator委托?

时间:2016-08-04 08:07:24

标签: c# nlog

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

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

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

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

不幸的是我无法弄清楚如何“正确”使用它。这甚至记录了吗?

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

2 个答案:

答案 0 :(得分:4)

建议如下:

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

答案 1 :(得分:2)

  

如果我想用NLog实现最佳性能

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

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

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

全部 我的意思是,在这里和那里传递代表将不会使你的或NLog代码更快。而且,这个:

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

更慢

_logger.Info("test");

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

P.S。

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

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

同样,这不是关于性能,而是关于可读性。