La implementación de logger ya es un singleton.
Varias llamadas a logging.getLogger ('someLogger') devuelven una referencia al mismo objeto de registrador. Esto es cierto no solo dentro del mismo módulo, sino también entre módulos siempre que esté en el mismo proceso de intérprete de Python. Es cierto para las referencias al mismo objeto; Además, el código de la aplicación puede definir y configurar un registrador padre en un módulo y crear (pero no configurar) un registrador secundario en un módulo separado, y todas las llamadas del registrador al niño pasarán al padre. Aquí hay un módulo principal
Fuente: uso de registro en varios módulos
Entonces, la forma en que debe utilizar esto es:
Supongamos que hemos creado y configurado un registrador llamado 'main_logger' en el módulo principal (que simplemente configura el registrador, no devuelve nada).
# get the logger instance
logger = logging.getLogger("main_logger")
# configuration follows
...
Ahora en un submódulo, si creamos un registrador secundario siguiendo la jerarquía de nombres 'main_logger.sub_module_logger' , no necesitamos configurarlo en el submódulo. Basta con la creación del registrador siguiendo la jerarquía de nombres.
# get the logger instance
logger = logging.getLogger("main_logger.sub_module_logger")
# no configuration needed
# it inherits the configuration from the parent logger
...
Y tampoco agregará un controlador duplicado.
Consulte esta pregunta para obtener una respuesta un poco más detallada.