setlevel practices logger info example disable_existing_loggers best python logging handler

practices - python logging disable_existing_loggers



No se encontraron controladores para el registrador (4)

Adicional a la respuesta de logging.basicConfig() , llamar a logging.basicConfig() es una función conveniente que le proporcionará un StreamHandler y un Formatter predeterminados. Eso es suficiente si desea tener rápidamente una funcionalidad de registro. Puede personalizar su comportamiento pasando basicConfig algunos argumentos:

Agregue parámetros útiles : marca de tiempo de salida junto con el mensaje

logger = logging.basicConfig(level=logging.DEBUG, format=''%(asctime)s - %(name)s - %(levelname)s - %(message)s'')

Esto debería estar bien para la mayoría de las necesidades únicas. Si necesita más control sobre su configuración, puede agregar comportamientos más sofisticados definiendo los atributos del registrador usted mismo.

Ejemplo sofisticado : sin usar la función basicConfig

import logging logger = logging.getLogger("mylogger") streamHandler = logging.StreamHandler() streamHandler.setLevel(logging.DEBUG) formatter = logging.Formatter(''%(asctime)s - %(name)s - %(levelname)s - %(message)s'') streamHandler.setFormatter(formatter) logger.addHandler(streamHandler) logger.info("Files copied") logger.warning("disk quota exceeded") >> 2017-12-06 11:11:12, 090 - mylogger - INFO Files copied >> 2017-12-06 11:11:12, 091 - mylogger - WARNING disk quota exceeded

El siguiente paso en un entorno más grande sería obtener un nuevo registrador del creado anteriormente, para mantener primero el formato y también para mantener una "jerarquía de registros"

logger2 = logging.getLogger("mylogger.new") logger2.info("New Logger info") >> 2017-12-06 11:11:12, 091 - mylogger.new - New logger info

Una buena referencia es el libro de cocina de registro: https://docs.python.org/2/howto/logging-cookbook.html

Soy novato en python. Intenté iniciar sesión en Python y me encontré No se encontraron controladores para el error del registrador al intentar imprimir alguna advertencia a través de la instancia del registrador. A continuación se muestra el código que probé

import logging logger=logging.getLogger(''logger'') logger.warning(''The system may break down'')

Y recibo este error No se encontraron controladores para el registrador "logger"

Lo que me confunde es cuando primero intento imprimir una advertencia usando el logging y luego a través del logger , funciona bien, como

>>> import logging >>> logging.warning(''This is a WARNING!!!!'') WARNING:root:This is a WARNING!!!! >>> >>> logger.warning(''WARNING!!!!'') WARNING:logger:WARNING!!!!

¿Alguien puede arrojar algo de luz sobre lo que está sucediendo en el segundo escenario?


Llame a logging.basicConfig () :

>>> import logging >>> logging.basicConfig() >>> logger = logging.getLogger(''logger'') >>> logger.warning(''The system may break down'') WARNING:logger:The system may break down


Para registrar algún mensaje a través del logger , en Python se debe agregar al menos un controlador al objeto logger . Por defecto, las funciones de debug , warn y otras en el módulo de logging llamarán a basicConfig que a su vez agregará un StreamHandler al root logger .

Siempre se recommended agregar el controlador requerido al objeto de registrador que está escribiendo para su módulo.

Puede consultar los documentos oficiales de Python , que tienen un tutorial increíble o puede consultar mejor el código fuente del módulo de registro usted mismo.

Simplemente puede verificar la fuente en Python shell,

import logging import inspect print(inspect.getsource(logging))

Finalmente, llamar a basicConfig explícitamente resolverá el problema.

import logging logging.basicConfig() logger = logging.getLogger(''logger'') logger.warning(''The system may break down'')


Si obtiene este error al usar sentry ( No handlers could be found for logger "sentry.errors" ), podría deberse a un error de centinela para el soporte SNI.

consulte https://github.com/getsentry/raven-python/issues/523 para obtener más detalles. Una solución rápida es reemplazar el esquema DSN por threaded+requests+https :

RAVEN_CONFIG = { ''dsn'': ''threaded+requests+https://[email protected]/1'', }