如果我做NLog.Trace():
logger.Trace("Json: {0}", Newtonsoft.Json.JsonConvert.DeserializeObject(myObject));
我的最低级别是错误:
<logger name="*" minlevel="Error" writeTo="mail" enabled="false" />
我的对象是否会被反序列化?是的,当然是的。但是我怎么能避免这种情况呢?
答案 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));
这有其自身的缺点(代表的构造),但它可能比昂贵的方法便宜。通常,您会将此作为重载提供,并且仅在您知道评估表达式的情况下才使用它。