On 27/01/2021 20:04, Zoran wrote:
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?
You just have to set the level in the root logger. The easiest way to
achieve that is to forget about your app_logger wrapper around logging
and call
logging.basicConfig(level=yourlevel, format=yourformat)
in main.py and to create the loggers in main and mymodule
with
logger = logging.getLogger(__name__)
--
https://mail.python.org/mailman/listinfo/python-list