This issue tracker has been migrated to GitHub, and is currently read-only.
For more information, see the GitHub FAQs in the Python's Developer Guide.

Author vinay.sajip
Recipients r.david.murray, the.mulhern, vinay.sajip, yselivanov
Date 2014-03-14.08:51:38
SpamBayes Score -1.0
Marked as misclassified Yes
Message-id <1394787098.76.0.704048791222.issue20918@psf.upfronthosting.co.za>
In-reply-to
Content
I've looked into it further, and IMO this is not a bug. The rationale is this: when an exception is raised during logging, it is passed to a
handleError method, see

http://hg.python.org/cpython/file/67ada6ab7fe2/Lib/logging/__init__.py#l786

This swallows the exception if logging.raiseExceptions is false or if there is no sys.stderr, otherwise it just writes the original traceback to sys.stderr and ignores any I/O errors which result during that write.

ISTM RDM's analysis is not quite right: logging doesn't try to re-print the arguments. The key indicator is the line

Logged from file <stdin>, line 1

which appears in the traceback shown, indicating that there is no exception in the handleError method itself.

The suggestion by the.mulhern is also based on an incorrect assumption: logging applies the formatting lazily (i.e. late, rather than early), so it would be premature to do anything in LogRecord.__init__. The exception-causing code is called after determining that the record must be processed, and a formatter is asked to format it. This is by design. Note that logging doesn't crash: if the script

class Junk:
    def __repr__(self):
        raise AttributeError('junk')

import logging; logging.warning('%r', Junk())
print('Done.')

is run, it prints

Traceback (most recent call last):
  File "/home/vinay/projects/python/2.7/Lib/logging/__init__.py", line 851, in emit
    msg = self.format(record)
  File "/home/vinay/projects/python/2.7/Lib/logging/__init__.py", line 724, in format
    return fmt.format(record)
  File "/home/vinay/projects/python/2.7/Lib/logging/__init__.py", line 464, in format
    record.message = record.getMessage()
  File "/home/vinay/projects/python/2.7/Lib/logging/__init__.py", line 328, in getMessage
    msg = msg % self.args
  File "logtest3.py", line 3, in __repr__
    raise AttributeError('junk')
AttributeError: junk
Logged from file logtest3.py, line 5
Done.

That last "Done." shows that logging keeps going: while it prints the exception traceback to sys.stderr (so it looks like it's failing) it is not actually failing, and the code after the logging call continues normally even if there is a formatting failure (or other exception during emission of a logging message).

Closing as invalid, unless you come up with something else :-)
History
Date User Action Args
2014-03-14 08:51:38vinay.sajipsetrecipients: + vinay.sajip, r.david.murray, yselivanov, the.mulhern
2014-03-14 08:51:38vinay.sajipsetmessageid: <1394787098.76.0.704048791222.issue20918@psf.upfronthosting.co.za>
2014-03-14 08:51:38vinay.sajiplinkissue20918 messages
2014-03-14 08:51:38vinay.sajipcreate