python.logging: ¿Por qué no funciona mi configuración non-BasicConfig?

Quiero iniciar sesión en un solo archivo de registro desde los módulos principales y todos los módulos secundarios.

Los mensajes de registro enviados desde un archivo principal, donde defino el registrador, funcionan como se espera. Pero faltan los que se envían desde una llamada a una función importada.

Funciona si uso logging.basicConfig como en el Ejemplo 1 a continuación. Pero el segundo ejemplo que permite más configuraciones personalizadas no funciona.

¿Alguna idea de por qué?

# in the submodule I have this code import logging logger = logging.getLogger(__name__) 

EJEMPLO 1 – Trabajar

Aquí creo dos manejadores y los paso a basicConfig :

 # definition of root looger in main module formatter = logging.Formatter(fmt="%(asctime)s %(name)s.%(levelname)s: %(message)s", datefmt="%Y.%m.%d %H:%M:%S") handler = logging.FileHandler('logger.log') handler.setFormatter(formatter) handler.setLevel(logging.DEBUG) handler2 = logging.StreamHandler(stream=None) handler2.setFormatter(formatter) handler2.setLevel(logging.DEBUG) logging.basicConfig(handlers=[handler, handler2], level=logging.DEBUG) logger = logging.getLogger(__name__) 

EJEMPLO 2 – No funciona

Aquí creo dos controladores y los addHandler() al root logger:

 # definition of root looger in main module logger = logging.getLogger(__name__) logger.setLevel(logging.DEBUG) handler = logging.FileHandler('logger.log') handler.setFormatter(formatter) handler.setLevel(logging.DEBUG) #handler.setLevel(logging.ERROR) logger.addHandler(handler) handler = logging.StreamHandler(stream=None) handler.setFormatter(formatter) handler.setLevel(logging.DEBUG) logger.addHandler(handler) 

Debe configurar el (uno y único) registrador raíz en el módulo principal de su software. Esto se hace llamando

 logger = logging.getLogger() #without arguments 

en lugar de

 logger = logging.getLogger(__name__) 

(Python doc en el registro)

El segundo ejemplo crea un registrador secundario separado con el nombre de su script.

Si no hay controladores definidos en los submódulos, el mensaje de registro se pasa al registrador raíz para manejarlo.

Puede encontrar una pregunta relacionada aquí: Python Logging – Cómo heredar el controlador y el nivel de logger raíz