Registro de Python: cómo heredar el controlador y el nivel del registrador raíz

Soy un novato de python, que intenta implementar el inicio de sesión en mi código. Tengo dos modulos

main.py submodule.py

main.py

import logging from logging.handlers import RotatingFileHandler import submodule import logging from logging.handlers import RotatingFileHandler logger = logging.getLogger(__name__) logger.setLevel(logging.DEBUG) fh = RotatingFileHandler('master.log', maxBytes=2000000, backupCount=10) formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s') fh.setFormatter(formatter) logger.addHandler(fh) logger.debug('DEBUG LEVEL - MAIN MODULE') logger.info('INFO LEVEL - MAIN MODULE') submodule.loggerCall() 

submódulo.py

 import logging from logging.handlers import RotatingFileHandler def loggerCall(): logger = logging.getLogger(__name__) # logger.setLevel(logging.DEBUG) fh = RotatingFileHandler('master.log', maxBytes=2000000, backupCount=10) formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s') fh.setFormatter(formatter) logger.addHandler(fh) logger.debug('SUBMODULE: DEBUG LOGGING MODE : ') logger.info('Submodule: INFO LOG') return 

Pensé que siempre y cuando llame al getLogger desde mi submódulo, debería heredar el nivel de registro y los detalles del controlador desde el registrador de raíz. Sin embargo, en mi caso, tengo que especificar de nuevo el nivel de registro y el controlador en el submódulo para imprimirlos en el mismo archivo de registro.

Además, si tengo muchos métodos y clases dentro de mi submódulo. ¿Cómo puedo hacerlo sin tener que definir de nuevo mi nivel de registro y mi controlador?

La idea es tener un solo archivo de registro con los módulos principales y subimpresos que se imprimen en el mismo registro basado en el nivel de registro establecido en el módulo principal.

Gracias por adelantado

Lo siento, ya que esto podría ser una pregunta duplicada y sí hice esas preguntas similares, pero no pude entender cómo funciona esto. De ahí la publicación de esta pregunta. No estoy creando intencionalmente un bcz duplicado que no busqué.

El problema aquí es que no está inicializando el registrador raíz; estás inicializando el registrador para tu módulo principal.

Prueba esto para main.py:

 import logging from logging.handlers import RotatingFileHandler import submodule logger = logging.getLogger() # Gets the root logger logger.setLevel(logging.DEBUG) fh = RotatingFileHandler('master.log', maxBytes=2000000, backupCount=10) formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s') fh.setFormatter(formatter) logger.addHandler(fh) logger.debug('DEBUG LEVEL - MAIN MODULE') logger.info('INFO LEVEL - MAIN MODULE') submodule.loggerCall() 

Entonces intente esto para submodule.py:

 def loggerCall(): logger = logging.getLogger(__name__) logger.debug('SUBMODULE: DEBUG LOGGING MODE : ') logger.info('Submodule: INFO LOG') return 

Como dijo que quería enviar mensajes de registro de todos sus submódulos al mismo lugar, debe inicializar el registrador raíz y luego simplemente usar los métodos de registro de mensajes (junto con las llamadas a setlevel (), según corresponda). Como no hay un controlador explícito para su submódulo, logging.getLogger(__name__) atravesará el árbol hasta la raíz, donde encontrará el controlador que estableció en main.py.