【问题标题】:How to use the NLog LogMessageGenerator delegate?如何使用 NLog LogMessageGenerator 委托?
【发布时间】:2016-08-04 08:07:24
【问题描述】:

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

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

使用代理写日志消息怎么样?

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

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

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

【问题讨论】:

    标签: c# nlog


    【解决方案1】:

    建议如下:

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

    【讨论】:

      【解决方案2】:

      如果我想使用 NLog 获得最佳性能

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

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

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

      就是这样
      我的意思是,到处传递代表不会让您的或 NLog 代码更快。此外,这个:

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

      更慢,相比:

      _logger.Info("test");
      

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

      附言

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

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

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

      【讨论】:

        猜你喜欢
        • 2013-11-26
        • 1970-01-01
        • 2019-10-07
        • 1970-01-01
        • 2014-03-16
        • 1970-01-01
        • 1970-01-01
        • 2015-07-15
        • 2016-02-10
        相关资源
        最近更新 更多