[Python-ideas] Adding exception logging function to syslog module.
Eric Smith
eric at trueblade.com
Tue Mar 23 00:31:08 CET 2010
Sean Reifschneider wrote:
> As someone who writes mostly programs that run unattended on servers, one
> thing I often want to do is have my tracebacks logged to syslog. I would
> propose adding something like the following to the syslog module:
>
> def logexceptions(also_stderr = True):
> class ExceptHook:
> def __init__(self, useStderr = False):
> self.useStderr = useStderr
>
> def __call__(self, etype, evalue, etb):
> import traceback, string
> tb = traceback.format_exception(*(etype, evalue, etb))
> tb = map(string.rstrip, tb)
> tb = string.join(tb, '\n')
> for line in string.split(tb, '\n'):
> syslog.syslog(line)
> if self.useStderr:
> sys.stderr.write(line + '\n')
> sys.excepthook = ExceptHook(also_stderr)
>
> Now, the downside to this is that currently the syslog module is entirely
> in C. So either I'd need to implement the above in C, or I'd need to add a
> Python wrapper to the C module and use that.
>
> This would allow users to also log exceptions to syslog by doing:
>
> import syslog
> syslog.openlog('myprogram', syslog.LOG_PID, syslog.LOG_MAIL)
> syslog.logexceptions()
>
> Thoughts?
I think this would be a great addition. I have to do similar things all
of the time, although I never though of using sys.excepthook, for some
reason. I'll have to steal your code in the meantime!
A simpler pure Python version would be:
from __future__ import print_function
def logexceptions(also_stderr=True):
import sys
import traceback
import syslog
def syslog_exception(etype, evalue, etb):
# The result of traceback.format_exception might contain
# embedded newlines, so we have the nested loops.
for line in traceback.format_exception(etype, evalue, etb):
for line in line.rstrip().split('\n'):
syslog.syslog(line)
if also_stderr:
print(line, file=sys.stderr)
sys.excepthook = syslog_exception
logexceptions(True)
If you need any help implementing this in C, I'll assist (although I'm
out of town for 2 weeks starting Thursday).
--
Eric.
More information about the Python-ideas
mailing list