Ver Mensaje Individual
  #3 (permalink)  
Antiguo 20/09/2011, 10:58
refreegrata
 
Fecha de Ingreso: agosto-2008
Mensajes: 198
Antigüedad: 15 años, 8 meses
Puntos: 27
Respuesta: Excepciones, obtener archivo y número de línea

Ok, muchísimas gracias, era justo lo que necesitaba. Al final lo dejé así:
Código:
from django.conf import settings
import traceback
import sys
import logging

class PruebaMiddleware:
    def obtenerUsuario(self, request):
        ...

    def process_exception(self, request, exception):
        try:
            tb = sys.exc_info()[2]
            ubicacion = traceback.extract_tb(tb).pop()
            mensaje = u'Tipo de excepción: %s\nValor: %s\nArchivo, línea, funcion: %s, %s, %s\nUsuario: %s\nEstado: Sin reparar' % (type(exception).__name__,
                                                                                                                                exception.__unicode__(),
                                                                                                                                ubicacion[0],
                                                                                                                                ubicacion[1],
                                                                                                                                ubicacion[2],
                                                                                                                                self.obtenerUsuario(request))
            logging.basicConfig(filename = settings.ARCHIVO_LOG, filemode = 'a', format='Nivel: %(levelname)s\nFecha-hora: %(asctime)s\n%(message)s\n', level=logging.ERROR)
            logging.error(mensaje)
        except:
            pass
        return None
Una cosa que no pude comprender del todo es, al cambiar el nivel a DEBUG me almacena no sólo datos provenientes de las excepción, si no también datos de otras operaciones realizadas por el middleware, como las de comprobación de sesiones y otros. Tendrá esto que ver más con Django que Python?, pero es sólo una duda.

-------------------------------------
Nivel: DEBUG
Fecha-hora: 2011-09-20 12:47:26,352
(0.002) SAVEPOINT s121....5408_x1; args=()

Nivel: DEBUG
Fecha-hora: 2011-09-20 12:47:26,358
(0.002) SELECT (1) AS "a" FROM "django_session" WHERE "django_session"."session_key" = E'.....' LIMIT 1; args=('....',)

Nivel: DEBUG
Fecha-hora: 2011-09-20 12:47:26,364
(0.003) UPDATE "django_session" SET "session_data" = ........', '.....')

Nivel: DEBUG
Fecha-hora: 2011-09-20 12:47:46,431
------ MI ERROR -----
-------------------------------------

Bueno, Django tambień tiene un módulo de logging que se basa en estas librerías de Python, pero me parecieron (corríjanme si me equivoco) más enfocadas al envío de correos avisando la situación, que al almacenamiento de errores en un log.

Saludos.