tutorial software logs logger found for error debug could python django logging

python - logs - sentry error tracking software



Django logging atributos personalizados en formateador (3)

La palabra clave extra no es una solución. Esa es la forma más elocuente de escribir formateadores personalizados, a menos que esté escribiendo un registro personalizado por completo.

format: ''%(asctime).19s %(levelname)s - %(username)s: %(message)s'' logging.basicConfig(format=format) logger.info(message, extra={''username'' : request.user.username})

Algunas notas de la documentación ( ** kwars para el registrador Django ):

Las claves en el diccionario pasadas en extra no deben coincidir con las claves utilizadas por el sistema de registro.

Si faltan las cadenas esperadas por el formateador, el mensaje no se registrará.

Esta función está diseñada para su uso en circunstancias especializadas, y no siempre.

¿Cómo puede Django usar el registro para registrar con atributos personalizados en el formateador? Estoy pensando en registrar el nombre de usuario registrado, por ejemplo.

En el script settings.py , se define la variable LOGGING:

LOGGING = { ''version'': 1, ''disable_existing_loggers'': False, ''filters'': { ''require_debug_false'': { ''()'': ''django.utils.log.RequireDebugFalse'' }, }, ''formatters'' : { ''info_format'' : { ''format'' : ''%(asctime)s %(levelname)s - %(message)s'', }, } }

Deseo usar un formato, algo como:

''format'' : ''%(asctime).19s %(levelname)s - %(username)s: %(message)s''

Donde nombre de usuario sería el usuario actualmente conectado. Tal vez se pueda agregar aquí cualquier otro tipo de variables de sesión.

Una solución aquí es usar el parámetro extra en los métodos del registrador, que recibe un diccionario con las claves como las cadenas que quiero usar en la cadena de formato:

logger.info(message, extra={''username'' : request.user.username})

Otra solución (fea) sería construir el atributo de mensaje para incluir las cosas que no forman parte de los atributos predeterminados que tienen los formateadores de registro.

message = request.user.username + " - " + message logger.info(message)

Pero, ¿hay una manera de configurar la cadena de formato con ciertos atributos y hacer que Django los asigne automáticamente a la API de registro? Si% (nombre de usuario) es, por ejemplo, el request.user.username, de cualquier otro tal vez ...


Proporcionaré una de las muchas respuestas completas posibles a esta pregunta:

¿Cómo puede Django usar el registro para registrar con atributos personalizados en el formateador? Estoy pensando en registrar el nombre de usuario registrado, por ejemplo.

Otras respuestas se refirieron a la forma de agregar información contextual adicional a través de las utilidades de registro de python. El método de usar filtros para adjuntar información adicional al registro de anotaciones es ideal, y se describe mejor en la documentación:

https://docs.python.org/3/howto/logging-cookbook.html#using-filters-to-impart-contextual-information

Esto todavía no nos dice cómo obtener al usuario de la solicitud de una manera universal. La siguiente biblioteca hace esto:

https://github.com/ninemoreminutes/django-crum

Por lo tanto, combine los dos y tendrá una respuesta completa a la pregunta que se ha formulado.

import logging from crum import get_current_user class ContextFilter(logging.Filter): """ This is a filter injects the Django user """ def filter(self, record): record.user = get_current_user() return True if __name__ == ''__main__'': logging.basicConfig(level=logging.DEBUG, format=''User: %(user)-8s %(message)s'') a1 = logging.getLogger(''a.b.c'') f = ContextFilter() a1.addFilter(f) a1.debug(''A debug message'')

Esto tendrá que suceder dentro de un ciclo de solicitud-respuesta de Django con la biblioteca CRUM correctamente instalada.


Puedes usar un filtro para agregar tu atributo personalizado. Por ejemplo :

def add_my_custom_attribute(record): record.myAttribute = ''myValue'' record.username = record.request.user.username return True LOGGING = { ''version'': 1, ''disable_existing_loggers'': False, ''filters'': { ... ''add_my_custom_attribute'': { ''()'': ''django.utils.log.CallbackFilter'', ''callback'': add_my_custom_attribute, } }, ''handlers'': { ... ''django.server'': { ''level'': ''INFO'', ''class'': ''logging.StreamHandler'', ''filters'': [''add_my_custom_attribute''], ''formatter'': ''django.server'', }, }, ... }

Al instalar un filtro, puede procesar cada registro de registro y decidir si se debe pasar del registrador al controlador.

El filtro obtiene el registro que contiene todos los detalles del registro (es decir, tiempo, gravedad, solicitud, código de estado).

Los atributos del registro son utilizados por el formateador para formatearlo en un mensaje de cadena. Si agrega sus atributos personalizados a ese registro, también estarán disponibles para el formateador.