Foros del Web » Programando para Internet » Python »

Excepciones, obtener archivo y número de línea

Estas en el tema de Excepciones, obtener archivo y número de línea en el foro de Python en Foros del Web. Hola lista. Tengo una duda. Quisiera capturar las excepciones gatilladas y volcarlas sobre un archivo log. Lo que no sé y no he podido encontrar ...
  #1 (permalink)  
Antiguo 20/09/2011, 08:39
 
Fecha de Ingreso: agosto-2008
Mensajes: 198
Antigüedad: 15 años, 8 meses
Puntos: 27
Excepciones, obtener archivo y número de línea

Hola lista. Tengo una duda. Quisiera capturar las excepciones gatilladas y volcarlas sobre un archivo log. Lo que no sé y no he podido encontrar es como obtener el número de línea y archivo desde el cuál se gatillo la excepción.

Esto es para una aplicación hecha con Django 1.3, Python 2.7. De momento tengo esto sobre una clase definida para actuar en el middleware:

Código:
class PruebaMiddleware:
    def obtenerUsuario(self, request):
        .....

    def process_exception(self, request, exception):
        import codecs
        from time import strftime
        from datetime import datetime
        try:          
            mensaje = u'fecha - hora:%s\ntipo: %s\nvalor: %s\nusuario: %s\n\n' % (datetime.today().strftime("%d/%m/%Y %H:%M:%S"),
                                                                                  type(exception).__name__,
                                                                                  exception.__unicode__(),
                                                                                  self.obtenerUsuario(request))  
            archivo = codecs.open(settings.ARCHIVO_LOG, 'a', 'utf-8')
            archivo.write(mensaje)
            archivo.close()
        except:
            pass
        return None
Y no sé si existe alguna manera de obtener la ruta al error. He intentado con "location" y "__location__", pero nada.
Mi idea, al final, es intentar pasar inicialmente los errores a la base de datos, pero si se provocase una excepción en ese intento pasarlo a un archivo log.

Como es algo simple no me he querido aventurar a inastalar django-sentry o algo así por que no me gustaría tocar tanto el servidor.

Saludos.
  #2 (permalink)  
Antiguo 20/09/2011, 08:43
Avatar de razpeitia
Moderador
 
Fecha de Ingreso: marzo-2005
Ubicación: Monterrey, México
Mensajes: 7.321
Antigüedad: 19 años, 1 mes
Puntos: 1360
Respuesta: Excepciones, obtener archivo y número de línea

Puedes usar traceback para detectar en que parte del código ocurrió un error y luego usar logging para manejar los logs.
  #3 (permalink)  
Antiguo 20/09/2011, 10:58
 
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.

Etiquetas: django, excepciones, servidor
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 11:24.