如果日志级别低于阈值,则防止昂贵的日志调用

时间:2016-08-19 10:04:37

标签: c# nlog

如果我做NLog.Trace():

logger.Trace("Json: {0}", Newtonsoft.Json.JsonConvert.DeserializeObject(myObject));

我的最低级别是错误:

<logger name="*" minlevel="Error" writeTo="mail" enabled="false" />

我的对象是否会被反序列化?是的,当然是的。但是我怎么能避免这种情况呢?

3 个答案:

答案 0 :(得分:6)

if(logger.IsTraceEnabled)
    logger.Trace("Json: {0}", Newtonsoft.Json.JsonConvert.SerializeObject(myObject));

请参阅IsTraceEnabled

这是一种很好的做法,用于记录呼叫本身可能很昂贵的呼叫(如上面的情况)或重复的高呼叫循环。对于其他一切,通常不需要添加检查,因为框架本身在调用中执行相同的检查。

答案 1 :(得分:1)

创建类似

的扩展方法
public static class NlogExtensions
{
    public static void Trace(this Logger logger, string format, Func<string> func)
    {
        if (logger.IsTraceEnabled)
        {
            logger.Trace(format, func());
        }
    }
}

将跟踪调用更改为

logger.Trace("Json: {0}", () => Newtonsoft.Json.JsonConvert.DeserializeObject(myObject));

因此,只有在启用跟踪时才会序列化myObject。

答案 2 :(得分:1)

“延迟日志记录”的一种方法是使用表达式(创建返回消息的函数委托)而不是使用直接评估:

logger.Trace(() =>"Json: "+ Newtonsoft.Json.JsonConvert.DeserializeObject(myObject));

这有其自身的缺点(代表的构造),但它可能比昂贵的方法便宜。通常,您会将此作为重载提供,并且仅在您知道评估表达式的情况下才使用它。

参考: https://stackoverflow.com/a/8347895/2073920