The Python Oracle

Should logger.exception only be called inside an except block? Why?

Become part of the top 3% of the developers by applying to Toptal https://topt.al/25cXVn

--

Track title: CC B Schuberts Piano Sonata No 16 D

--

Chapters
00:00 Question
00:52 Accepted answer (Score 8)
03:14 Answer 2 (Score -1)
04:23 Thank you

--

Full question
https://stackoverflow.com/questions/2480...

Question links:
[logger.exception]: https://docs.python.org/2/library/loggin...

Accepted answer links:
[RFC 2119]: http://www.ietf.org/rfc/rfc2119.txt
[sys.exc_info()]: https://docs.python.org/2/library/sys.ht...
[Formatter.format_exception()]: https://docs.python.org/2/library/loggin...
[Logger.debug()]: https://docs.python.org/2/library/loggin...

--

Content licensed under CC BY-SA
https://meta.stackexchange.com/help/lice...

--

Tags
#python #python27 #exception #logging

#avk47



ACCEPTED ANSWER

Score 10


The method is designed for use in an exception handler. As such the documentation tells you this, by using the word should, not must.

In the text of standards, should and must are rigidly defined; one means we advice you to do it this way, it'd be much better if you did, the other means it's an outright error if you don't do this. See RFC 2119 for the IETF taskforce wording.

All logging.exception() does is set the exc_info keyword argument before calling logging.error(). The exc_info argument is then later fleshed out to include the most recently handled exception, taken from sys.exc_info(). It is then up to the formatter to include the exception message (via the Formatter.format_exception() method) to format the exception.

Because sys.exc_info() works both in the except suite and out, both variants work. From a code documentation point of view, it is just clearer if you use it in the except handler.

You don't need to include the error message, really, because your log formatter should already do that for you:

logger.exception('debug message 2')  # exception should be included automatically

You can explicitly attach an exception to any log message with:

logger.error('debug message 2', exc_info=sys.exc_info())

or any other 3-tuple value with the exception type, the exception value and a traceback. Alternatively, set exc_info=1 to have the logger retrieve the information from sys.exc_info() itself.

See the documentation for Logger.debug():

exc_info which, if it does not evaluate as false, causes exception information to be added to the logging message. If an exception tuple (in the format returned by sys.exc_info()) is provided, it is used; otherwise, sys.exc_info() is called to get the exception information.