我的代码中有记录模块,经常使用。每个日志记录方法的第一个参数始终是日志级别,而其他参数表示格式化字符串及其参数。参数通常调用一些其他函数来计算该参数的值。例如。当我想打印列表时,我使用这样的东西:
Logger.Log(Info, "Printed list is: ", string.Join(", ", myList));
这有什么问题?首先会对string.Join(", ", myList)
进行评估,然后在此处调用Log方法,根据当前日志记录级别,将确定是否将消息记录到某个文件中。如果不记录消息(当前日志记录级别小于Info),则不评估string.Join(", ", myList)
。
只有当前的日志记录级别至少是方法调用中指定的日志级别时,有没有办法(没有大量的手动更改)来调用日志调用和参数评估?
答案 0 :(得分:0)
您可以在Logging类上创建一个方法,该方法将委托作为参数,并且只有在需要记录消息时才调用委托。像这样的东西
public static class Logger
{
public static void Log(LogLevel level, Func<string> delegateFunction) {
if (level >= CurrentLogLevel)
{
var stringToLog = delegateFunction();
Log(level, stringToLog); // Use normal Log functionality to log it
}
}
}
然后你就可以这样称呼它
Logger.Log(Info, () => $"Printed list is: {string.Join(", ", myList)}");
当然,这要求您可以访问Logger代码。如果不这样做,您可以将其作为扩展名。