How to accept argparse.log_level parameter and propagate its value to all other modules
Zoran
zljubisic at gmail.com
Wed Jan 27 14:04:04 EST 2021
In the same folder I have three files: main.py, app_logger.py and mymodule.py with their contents:
# main.py
import argparse
import app_logger
import mymodule
import logging
logger = app_logger.get_logger(__name__)
def log_some_messages():
logger.debug(f'{__name__} - debug message')
logger.info(f'{__name__} - info message')
logger.warning(f'{__name__} - warning message')
if __name__ == '__main__':
parser = argparse.ArgumentParser(description="Script for executing data quality checks.")
parser.add_argument("--log-level", default='info', choices=['notset', 'debug', 'info', 'warning', 'error', 'critical'], help="set log level")
args = parser.parse_args()
logger.setLevel(eval(f"logging.{args.log_level.upper()}"))
log_some_messages()
mymodule.log_some_messages()
#mymodule.py
import logging
from script_logging import app_logger
logger = app_logger.get_logger(__name__)
def log_some_messages():
logger.debug(f'{__name__} - debug message')
logger.info(f'{__name__} - info message')
logger.warning(f'{__name__} - warning message')
#app_logger.py
import logging
_log_format = f"%(asctime)s - [%(levelname)s] - %(name)s - (%(filename)s).%(funcName)s(%(lineno)d) - %(message)s"
_log_level = logging.DEBUG
def get_stream_handler():
stream_handler = logging.StreamHandler()
stream_handler.setLevel(_log_level)
stream_handler.setFormatter(logging.Formatter(_log_format))
return stream_handler
def get_logger(name):
logger = logging.getLogger(name)
logger.setLevel(_log_level)
logger.addHandler(get_stream_handler())
return logger
When I run it with main.py --log-level debug I get the following output:
2021-01-25 13:21:01,151 - [DEBUG] - __main__ - (main.py).log_some_messages(10) - __main__ - debug message
2021-01-25 13:21:01,151 - [INFO] - __main__ - (main.py).log_some_messages(11) - __main__ - info message
2021-01-25 13:21:01,152 - [WARNING] - __main__ - (main.py).log_some_messages(12) - __main__ - warning message
2021-01-25 13:21:01,152 - [DEBUG] - mymodule - (mymodule.py).log_some_messages(10) - mymodule - debug message
2021-01-25 13:21:01,152 - [INFO] - mymodule - (mymodule.py).log_some_messages(11) - mymodule - info message
2021-01-25 13:21:01,152 - [WARNING] - mymodule - (mymodule.py).log_some_messages(12) - mymodule - warning message
which is OK. If I change --log-level parameter to 'warning', than output is the following:
2021-01-25 13:22:12,760 - [WARNING] - __main__ - (main.py).log_some_messages(12) - __main__ - warning message
2021-01-25 13:22:12,760 - [DEBUG] - mymodule - (mymodule.py).log_some_messages(10) - mymodule - debug message
2021-01-25 13:22:12,761 - [INFO] - mymodule - (mymodule.py).log_some_messages(11) - mymodule - info message
2021-01-25 13:22:12,761 - [WARNING] - mymodule - (mymodule.py).log_some_messages(12) - mymodule - warning message
As you can see, in main.py log level is set correctly, but in mymodule.py it is not.
How to accept argparse.log_level parameter in if __name__ == '__main__': and propagate its value to all other modules?
More information about the Python-list
mailing list