Index: Modules/syslogmodule.c =================================================================== --- Modules/syslogmodule.c (revision 80459) +++ Modules/syslogmodule.c (working copy) @@ -26,6 +26,9 @@ Revision history: +2010/04/26 (Sean Reifschneider) + - Adding helpers for logging exceptions to syslog. + 2010/04/20 (Sean Reifschneider) - Use basename(sys.argv[0]) for the default "ident". - Arguments to openlog() are now keyword args and are all optional. @@ -223,11 +226,85 @@ return PyInt_FromLong(mask); } +static PyObject * +syslog_logexception(PyObject *self, PyObject *args) +{ + PyObject *traceback, *result, *etype, *evalue, *etb, *line; + char *s, *eol; + int i; + + + if (!PyArg_ParseTuple(args, "OOO:logexception", + &etype, &evalue, &etb)) + return(NULL); + + if ((traceback = PyImport_ImportModule("traceback")) == NULL) { + return(NULL); + } + + if ((result = PyObject_CallMethod(traceback, "format_exception", + "OOO", etype, evalue, etb)) == NULL) { + Py_DECREF(traceback); + return(NULL); + } + + if (!PySequence_Check(result)) { + PyErr_SetString(PyExc_TypeError, + "Traceback format_exception() did not return a sequence"); + Py_DECREF(result); + return(NULL); + } + + for (i = 0; i < PySequence_Size(result); i++) { + if (!(line = PySequence_GetItem(result, i))) { + Py_DECREF(result); + return(NULL); + } + + for (s = PyString_AsString(line); s && *s; s = eol) { + PyObject *message, *syslogargs; + + eol = strchr(s, '\n'); + + syslogargs = PyTuple_New(1); + if (!syslogargs) { + Py_DECREF(line); + Py_DECREF(result); + return(NULL); + } + + if (eol) { + message = PyString_FromStringAndSize(s, eol - s); + eol++; + } else { + message = PyString_FromString(s); + } + if (message == NULL) { + Py_DECREF(syslogargs); + Py_DECREF(line); + Py_DECREF(result); + return(NULL); + } + + PyTuple_SET_ITEM(syslogargs, 0, message); + syslog_syslog(self, syslogargs); + Py_DECREF(syslogargs); + Py_DECREF(message); + } + Py_DECREF(line); + } + Py_DECREF(result); + + Py_INCREF(Py_None); + return Py_None; +} + /* List of functions defined in the module */ static PyMethodDef syslog_methods[] = { {"openlog", (PyCFunction) syslog_openlog, METH_VARARGS | METH_KEYWORDS}, {"closelog", syslog_closelog, METH_NOARGS}, + {"logexception",syslog_logexception, METH_VARARGS}, {"syslog", syslog_syslog, METH_VARARGS}, {"setlogmask", syslog_setlogmask, METH_VARARGS}, {"LOG_MASK", syslog_log_mask, METH_VARARGS},