The Scenario
This scenario illustrates two possible mistakes people make when using the python logging module. Analyze the following code and look for issues.
try: ... except SomeException as e: logger.error("Some meaningful error message. message={0}".format(e.message))
So what is wrong with that?
First and foremost, the code fails to use the existing Logging.exception function that could and in most cases should be used when logging exceptions. That function will automatically add all the exception info to the log, meaning that you will have the stack trace! Secondly, this sample used the string.format function to format the log message for the logging library when the logging library can in fact handle string formatting itself via old style format specifiers.
Fixing it
If I were to ignore the first problem, the following code is what I should have written. The benefit here is that the formatting is only executed if the log message is to be captured, unlike the first method.
try: ... except SomeException as e: logger.error("Some meaningful error message. message=%s", e.message)
Taking both errors into account, we should have used the exception function instead of the error function on the logger as well as the built in formatting. Given both of these, the code becomes.
try: ... except SomeException as e: logger.exception("Some meaningful error message")
More Data
This scenario led me to quantifying the error in execution time. The first set of data is related to logging alone; the second set extends to timing the different string formatting options. As you can see by the data, using the format is a good bit slower than the built-in “old-style” formatting in the logging package. While it will add up, it isn’t a world ending difference if done on a small scale. Again, the time difference is largely due to the fact that no formatting takes place unless the message has a high enough level. This data caused me to extend my study into timing the two different formatting options. As you can see by the data, the “old style” is marginally slower than the format style.
In the end
You should use functionality the API gives you. In most cases, and the case with python, it has been engineered to work, be fast and be maintainable. For more information on the logging module, check the python docs. 2.7 or 3.5.