[Python] Logger does not inherit config from parent process

Discussão em 'Python' iniciado por Stack, Fevereiro 5, 2025.

  1. Stack

    Stack Membro Participativo

    Consider the following minimal setup:

    /mymodule
    ├── __init__.py
    ├── main.py
    └── worker.py


    __init__.py is empty

    main.py:

    import sys
    import logging
    import multiprocessing
    from test.worker import do_stuff

    logger = logging.getLogger(__name__)

    def main():

    logging.basicConfig(
    format='[%(name)s] [%(levelname)s]: %(message)s',
    level=logging.DEBUG,
    )

    logger.debug('I am main. I manage workers')
    logger.info('I am main. I manage workers')
    logger.warning('I am main. I manage workers')

    p = multiprocessing.Process(target=do_stuff)
    p.start()

    if __name__ == '__main__':
    sys.exit( main() )



    worker.py:

    import logging

    logger = logging.getLogger(__name__)

    def do_stuff():
    logger.debug(f'I am a worker. I do stuff')
    logger.info(f'I am a worker. I do stuff')
    logger.error(f'I am a worker. I do stuff')
    logger.error(f'Here is my logger: {logger}')



    If I run python -m mymodule.main I get (as expected):

    [__main__] [DEBUG]: I am main. I manage workers
    [__main__] [INFO]: I am main. I manage workers
    [__main__] [WARNING]: I am main. I manage workers
    [mymodule.worker] [DEBUG]: I am a worker. I do stuff
    [mymodule.worker] [INFO]: I am a worker. I do stuff
    [mymodule.worker] [ERROR]: I am a worker. I do stuff
    [mymodule.worker] [ERROR]: Here is my logger: <Logger mymodule.worker (DEBUG)>


    But if I just rename /mymodule/main.py to mymodule/__main__.py and then run one of these commands: python -m mymodule.__main__ or python -m mymodule, I get this:

    [__main__] [DEBUG]: I am main. I manage workers
    [__main__] [INFO]: I am main. I manage workers
    [__main__] [WARNING]: I am main. I manage workers
    I am a worker. I do stuff
    Here is my logger: <Logger mymodule.worker (WARNING)>


    It is pretty clear to me that in the second case logger of mymodule.worker did not inherit configuration done by logging.basicConfig. But why? No change of code, just changed file name from main.py to __main__.py.

    I would like to have __main__.py to be able to easily run the module by its name and also to keep logging.basicConfig that will be inhertied by imported submodules and propagate correctly to subprocesses.

    Continue reading...

Compartilhe esta Página