2016-08-19 50 views
3

如果我做了NLog.Trace():防止昂贵的通话记录,如果记录水平低于阈值

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

而且我是的MinLevel上的错误:

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

将我的对象反序列化的没有?是的,当然是的。但我怎么能避免这种情况?

+2

难道你不希望_serialize_对象? – CodeCaster

+0

请标记为已接受 – Julian

回答

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

请参阅IsTraceEnabled

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

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的才会启用跟踪时,序列化。

1

一种方法是“懒惰测井”是使用式(创建函数代表一个返回消息),而不是使用直接评价:

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

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

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