A implementação do logger já é um singleton.
Várias chamadas para logging.getLogger ('someLogger') retornam uma referência ao mesmo objeto logger. Isso é verdadeiro não apenas dentro do mesmo módulo, mas também entre os módulos, desde que esteja no mesmo processo do interpretador Python. É verdade para referências ao mesmo objeto; além disso, o código do aplicativo pode definir e configurar um criador de logs pai em um módulo e criar (mas não configurar) um criador de logs filho em um módulo separado, e todas as chamadas do registrador para o filho passarão para o pai. Aqui está um módulo principal
Fonte - usando o registro em vários módulos
Portanto, a maneira como você deve utilizar isso é -
Vamos supor que criamos e configuramos um logger chamado 'main_logger' no módulo principal (que simplesmente configura o logger, não retorna nada).
# get the logger instance
logger = logging.getLogger("main_logger")
# configuration follows
...
Agora em um submódulo, se criarmos um registrador filho seguindo a hierarquia de nomenclatura 'main_logger.sub_module_logger' , não precisamos configurá-lo no submódulo. Apenas a criação do logger seguindo a hierarquia de nomes é suficiente.
# get the logger instance
logger = logging.getLogger("main_logger.sub_module_logger")
# no configuration needed
# it inherits the configuration from the parent logger
...
E também não adicionará um manipulador duplicado.
Veja esta pergunta para uma resposta um pouco mais detalhada.