Logging all uncaught exceptions

Steven D'Aprano steve at pearwood.info
Mon Jul 14 11:07:24 CEST 2014

On Mon, 14 Jul 2014 06:09:32 +0000, Steven D'Aprano wrote:

> I want to catch all uncaught exceptions in my application, log them,
> then handle as normal. Which, in practice, means a traceback. Is this
> the right way to do it?

I think I've answered my own question, which leads to the next question.

I'm logging with the syslog handler, and I can see all the logged 
messages *except* those generated by my logger's exception method.

Here's my code, consisting of two modules:

# === mylogging.py ===
import logging
import logging.handlers

name = 'Spam'
mylogger = logging.getLogger(name)
handler = logging.handlers.SysLogHandler(address='/dev/log')
mylogger.info('started logging ' + name)

# === main.py ===
from mylogging import mylogger
mylogger.info('main.py running')
mylogger.debug('I can see debugging messages too')

import sys
def my_error_handler(type, value, tb):
    msg = "Uncaught %s: %s" % (type, value)
    sys.__excepthook__(type, value, tb)

# Install exception handler.
sys.excepthook = my_error_handler

mylogger.info('testing exception logging...')
raise RuntimeError('a fake error occurred')

I run it from the command line on a Debian squeeze system:

steve at runes:~/test_logging$ python2.6 main.py 
Traceback (most recent call last):
  File "main.py", line 15, in <module>
    raise RuntimeError('a fake error occurred')
RuntimeError: a fake error occurred

The debug and info messages are logged:

root at runes:/var/log# tail -1 debug
Jul 14 19:04:39 runes I can see debugging messages too

root at runes:/var/log# tail -3 messages
Jul 14 19:04:39 runes started logging Spam
Jul 14 19:04:39 runes main.py running
Jul 14 19:04:39 runes testing exception logging...

but the exception info which should have been generated by 
mylogger.exception doesn't appear anywhere I can see.

What am I doing wrong?


More information about the Python-list mailing list