2012-01-09 4 views
5

Estoy probando algunos modelos de Django con bog-standerd django.test.Testcase. Mi models.py escribe en un registro de depuración, con el siguiente código de inicio:¿Cómo detener el inicio de sesión en las pruebas de unidad de Django desde la impresión a stderr?

import logging 
logger = logging.getLogger(__name__) # name is myapp.models 

y luego escribir en el registro con:

logger.debug("Here is my message") 

En mi settings.py, he establecido un solo FileHandler y un registrador para myapp, usando ese manejador y solo ese manejador. Esto es genial. Veo mensajes a ese registro. Cuando estoy en el shell de Django, I solo ver mensajes en ese registro.

Cuando, sin embargo, ejecuto mi banco de pruebas, mi consola de suite de pruebas también ve todos esos mensajes. Está utilizando un formateador diferente que no he definido explícitamente, y está escribiendo en stderr. No tengo definido un controlador de registro que escriba en stderr.

Realmente no quiero esos mensajes que envían spam a mi consola. Colas mi archivo de registro si quiero ver esos mensajes. ¿Hay alguna manera de detenerlo? (Sí, podría redirigir stderr, pero una salida útil va a stderr también.)

Edición: He creado dos manipuladores en mi settings.py:

'handlers': { 
    'null': { 
     'level': 'DEBUG', 
     'class': 'django.utils.log.NullHandler', 
    }, 
    'logfile' : { 
     'level':'DEBUG', 
     'class':'logging.FileHandler', 
     'filename':'%s/log/development.log' % PROJECT_DIR, 
     'formatter': 'simple' 
    }, 
}, 

y probado esto:

'loggers': { 
    'django': { 
     'level': 'DEBUG', 
     'handlers': ['null'] 
    }, 
    'myapp': { 
     'handlers': ['logfile'], 
     'level':'DEBUG', 
    }, 

... pero el comportamiento de volcado de registro/stderr sigue siendo el mismo. Es como si estuviera obteniendo otro controlador de registro cuando estoy ejecutando pruebas.

+0

¿Está preguntando cómo configurar el registro especialmente para el comando test o runtest? ¿Has intentado cambiar tu 'settings.py'? –

+0

El registro se comporta de manera diferente cuando estoy ejecutando pruebas en comparación con cuando no lo estoy. Quiero que se detenga. Creo que la configuración de registro en settings.py es probablemente lo que quiere cambiar; Simplemente no sé lo que necesito cambiar. Intenté configurar un controlador 'django' predeterminado sin suerte. – Nate

+0

Agregar algunos poking en uno de mis métodos de prueba en realidad solo parece hacer las cosas más confusas. Si hago un ml = logging.getLogger ('myapp.models') en mi prueba, parece que no tiene controladores (suponiendo que ml.handlers debería listarlos). En este contexto, sin embargo, al hacer ml.debug ("MESSAGE") escribe en mi archivo de registro pero no stderr. Estoy completamente desconcertado ahora. – Nate

Respuesta

3

No está claro a partir de su fragmento de configuración qué manejadores, si los hay, están configurados para el registrador de raíz. (También estoy asumiendo que estás usando Django 1.3.) ¿Puedes investigar y decirnos qué controladores se han agregado al registrador de raíz cuando estás ejecutando pruebas? AFAICT Django no agrega nada, tal vez algún código que está importando hace una llamada a basicConfig sin que usted se dé cuenta. Use algo como ack-grep para buscar cualquier ocurrencia de fileConfig, dictConfig, basicConfig y addHandler, todos los cuales podrían estar agregando un manejador al registrador de raíz.

Otra cosa que debe hacer: configure el indicador de propagación en False para todos los registradores de nivel superior (como "django", pero también los utilizados por sus módulos, digamos "myapp"). ¿Eso cambia las cosas?

+2

Aha! Añadiendo 'propagate': False al registrador para myapp fue el truco. Intenté esto, pero lo escribí mal como 'propogado', lo que, como era de esperar, no funcionó. ¡Gracias! – Nate

+0

eso es un gran error y también me atrapó un poco. 'propAgate', * not *' propOgate' –

Cuestiones relacionadas