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

3
如果我执行NLog.Trace():
logger.Trace("Json: {0}", Newtonsoft.Json.JsonConvert.DeserializeObject(myObject));

而我的最低日志级别设置为错误:

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

我的对象会被无意地反序列化吗?是的,当然会。但是我该如何避免这种情况呢?


2
你不想将对象进行序列化吗? - CodeCaster
please mark one as accepted - Julian
3个回答

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

请参考IsTraceEnabled

在记录通话本身很昂贵(如上述情况)或在高调用循环中时,此做法对于日志记录调用是很好的实践。对于其他所有情况,通常无需添加检查,因为框架本身在调用内部执行相同的检查。


1
一种实现“惰性日志记录”的方法是使用表达式(创建一个返回消息的函数委托),而不是直接求值:
logger.Trace(() =>"Json: "+ Newtonsoft.Json.JsonConvert.DeserializeObject(myObject));

这种方法也有其缺点(委托的构造),但它可能比昂贵的方法更便宜。通常,您会将其提供为重载,并仅在知道评估表达式很昂贵的情况下使用它。

Reference: https://dev59.com/AV3Va4cB1Zd3GeqPEdpI#8347895


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 才会被序列化。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接