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

C# 如果日志级别低于阈值,则防止昂贵的日志调用,c#,nlog,C#,Nlog,如果我执行NLog.Trace(): 我的minlevel出现错误: 我的对象将被免费反序列化吗?是的,当然是的。但我怎样才能避免这种情况呢 if(logger.IsTraceEnabled) logger.Trace("Json: {0}", Newtonsoft.Json.JsonConvert.SerializeObject(myObject)); 看 这对于记录调用本身可能很昂贵(如上面的例子)或重复性高调用循环中的调用是一个很好的实践。对于其他所有内容,通常不需要添加检查

如果我执行NLog.Trace():

我的minlevel出现错误:


我的对象将被免费反序列化吗?是的,当然是的。但我怎样才能避免这种情况呢

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


这对于记录调用本身可能很昂贵(如上面的例子)或重复性高调用循环中的调用是一个很好的实践。对于其他所有内容,通常不需要添加检查,因为框架本身在调用中执行相同的检查。

创建这样的扩展方法

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

因此,仅当启用跟踪时才会序列化myObject。

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

logger.Trace(() =>"Json: "+ Newtonsoft.Json.JsonConvert.DeserializeObject(myObject));
这有其自身的缺点(委托的构造),但它可能比昂贵的方法更便宜。通常,您会将其作为重载提供,并且仅在您知道计算表达式代价高昂的情况下使用它

参考:

是否要序列化对象?请将其中一个标记为已接受
logger.Trace("Json: {0}", () => Newtonsoft.Json.JsonConvert.DeserializeObject(myObject));
logger.Trace(() =>"Json: "+ Newtonsoft.Json.JsonConvert.DeserializeObject(myObject));