Improve logging performance by using functions to delay when complex
strings are created until after the current logging level has been
checked to ensure that log statement is actually going to be printed.
There are many places where very complex objects are printed at lower
logging levels which this avoids.