Todavía tengo que encontrar una forma de configurar el registro de Python con Django con la que esté contento. Mis requisitos son bastante simples:
- Diferentes controladores de registro para diferentes eventos, es decir, quiero poder iniciar sesión en diferentes archivos
- Fácil acceso a los registradores en mis módulos. El módulo debería poder encontrar su registrador con poco esfuerzo.
- Debería ser fácilmente aplicable a módulos de línea de comandos. Partes del sistema son procesos de demonio o de línea de comandos independientes. El registro debería poder utilizarse fácilmente con estos módulos.
Mi configuración actual es usar un logging.conf
archivo y configurar el registro en cada módulo desde el que inicio sesión. No se siente bien.
¿Tiene una configuración de registro que le guste? Detalla: cómo configuras la configuración (la usas logging.conf
o configuras en el código), dónde / cuándo inicias los registradores, y cómo accedes a ellos en tus módulos, etc.
Respuestas:
La mejor forma que he encontrado hasta ahora es inicializar la configuración de registro en settings.py, en ningún otro lugar. Puede utilizar un archivo de configuración o hacerlo mediante programación paso a paso; solo depende de sus requisitos. La clave es que generalmente agrego los controladores que quiero al registrador raíz, usando niveles y, a veces, registrando.Filtros para obtener los eventos que quiero en los archivos apropiados, consola, syslogs, etc.Por supuesto, puede agregar controladores a cualquier otro registrador también, pero, en mi experiencia, no suele ser necesario hacerlo.
En cada módulo, defino un registrador usando
y utilícelo para registrar eventos en el módulo (y, si quiero diferenciarlo más) use un registrador que sea un hijo del registrador creado anteriormente.
Si mi aplicación se va a usar potencialmente en un sitio que no configura el inicio de sesión en settings.py, defino un NullHandler en algún lugar de la siguiente manera:
y asegurarme de que se agregue una instancia a todos los registradores creados en los módulos de mis aplicaciones que usan el registro. (Nota: NullHandler ya está en el paquete de registro para Python 3.1 y estará en Python 2.7). Entonces:
Esto se hace para garantizar que sus módulos funcionen bien en un sitio que no configura el inicio de sesión en settings.py, y que no reciba ningún molesto mensaje "No se pudieron encontrar controladores para el registrador XYZ" (que son advertencias sobre posibles registro mal configurado).
Hacerlo de esta manera cumple con los requisitos establecidos:
getLogger(__name__)
.settings.py
.Actualización: tenga en cuenta que a partir de la versión 1.3, Django ahora incorpora soporte para el registro .
fuente
foo
gestionar los eventos registradosfoo.bar
. Re. ese hilo, tanto fileConfig como dictConfig ahora tienen opciones para evitar la desactivación de registradores antiguos. Vea este problema: bugs.python.org/issue3136 , que se produjo un par de meses después de su problema bugs.python.org/issue2697 ; de todos modos, se solucionó desde junio de 2008.logger = someutils.getLogger(__name__)
dóndesomeutils.getLogger
devuelve el registradorlogging.getLogger
con un null_handler ya agregado?NullHandler
agregado, generalmente solo el registrador de nivel superior para la jerarquía de paquetes. Entonces eso sería una exageración, en mi opinión.Sé que esta ya es una respuesta resuelta, pero según django> = 1.3 hay una nueva configuración de registro.
Pasar de lo antiguo a lo nuevo no es automático, así que pensé en escribirlo aquí.
Y, por supuesto, consulte el documento de django para obtener más información.
Esta es la configuración básica, creada por defecto con django-admin createproject v1.3 - el kilometraje puede cambiar con las últimas versiones de django:
Esta estructura se basa en el dictConfig de registro estándar de Python , que dicta los siguientes bloques:
formatters
- el valor correspondiente será un dict en el que cada clave es un id del formateador y cada valor es un dict que describe cómo configurar la instancia del formateador correspondiente.filters
- el valor correspondiente será un dict en el que cada clave es un ID de filtro y cada valor es un dict que describe cómo configurar la instancia de Filter correspondiente.handlers
- el valor correspondiente será un dict en el que cada clave es un identificador de controlador y cada valor es un dict que describe cómo configurar la instancia de Handler correspondiente. Cada controlador tiene las siguientes claves:class
(obligatorio). Este es el nombre completo de la clase de controlador.level
(Opcional). El nivel del manejador.formatter
(Opcional). El id del formateador para este controlador.filters
(Opcional). Una lista de identificadores de los filtros para este controlador.Normalmente hago al menos esto:
Que se traduce en:
editar
Ver las excepciones de solicitud ahora siempre se registran y el ticket # 16288 :
Actualicé la configuración de muestra anterior para incluir explícitamente el filtro correcto para mail_admins para que, de forma predeterminada, los correos electrónicos no se envíen cuando la depuración es Verdadero.
Deberías agregar un filtro:
y aplicarlo al controlador mail_admins:
De lo contrario
django.core.handers.base.handle_uncaught_exception
, no pasa errores al registrador 'django.request' si settings.DEBUG es True.Si no hace esto en Django 1.5 obtendrá un
pero las cosas seguirán funcionando correctamente AMBOS en django 1.4 y django 1.5.
** fin de editar **
Ese conf está fuertemente inspirado por el ejemplo de conf en el documento de django, pero agregando la parte del archivo de registro.
A menudo también hago lo siguiente:
Luego, en mi código de Python, siempre agrego un NullHandler en caso de que no se defina ninguna configuración de registro. Esto evita advertencias para ningún Handler especificado. Especialmente útil para bibliotecas que no necesariamente se llaman solo en Django ( ref )
[...]
¡Espero que esto ayude!
fuente
Inicializamos el registro en el nivel superior
urls.py
utilizando unlogging.ini
archivo.La ubicación de la
logging.ini
se proporciona ensettings.py
, pero eso es todo.Cada módulo luego hace
Para distinguir las instancias de prueba, desarrollo y producción, tenemos diferentes archivos logging.ini. En su mayor parte, tenemos un "registro de consola" que va a stderr solo con errores. Tenemos un "registro de la aplicación" que usa un archivo de registro continuo que va a un directorio de registros.
fuente
Actualmente estoy usando un sistema de registro, que yo mismo creé. Utiliza formato CSV para el registro.
django-csvlog
Este proyecto aún no tiene la documentación completa, pero estoy trabajando en ello.
fuente