import functools, logging logging.config.dictConfig({ 'version': 1, 'formatters': { 'default': {'format': '[%(asctime)s] %(levelname)s @ %(module)s.%(funcName)s()#%(lineno)d: %(message)s'}, 'long': {'format': '[%(asctime)s] %(levelname)s @ %(module)s.%(funcName)s()#%(lineno)d: %(message)s', 'datefmt': '%Y-%m-%d %H:%M:%S'}, 'short': {'format': '[%(asctime)s] %(levelname)s @ %(module)s.%(funcName)s()#%(lineno)d: %(message)s', 'datefmt': '%H:%M:%S'}, }, #'filename': 'example.log', #'level': logging.ERROR, 'handlers': { 'console': { 'class': 'logging.StreamHandler', 'formatter': 'short', }, 'log_file_all': { 'level': 'NOTSET', 'class': 'logging.handlers.RotatingFileHandler', 'formatter': 'long', 'filename': 'admin/log/app.log', 'maxBytes': 5120000, # 5120000 = 5 MB 'backupCount': 5 }, 'log_file_warning': { 'level': 'WARNING', 'class': 'logging.handlers.RotatingFileHandler', 'formatter': 'long', 'filename': 'admin/log/app_warning.log', 'maxBytes': 512000, # 512000 = .512 MB 'backupCount': 5 }, 'test_handler': { 'class': 'logging.StreamHandler', 'level': 'INFO', 'formatter': 'short', } }, 'root': { 'handlers': ['console', 'log_file_all'], #, 'log_file_all', 'log_file_warning'], 'level': 'WARNING', # WARNING } }) log = logging.getLogger('root') log.setLevel(logging.ERROR) # DEBUG > INFO > WARNING > ERROR > CRITICAL # logging.basicConfig( # format='[%(asctime)s] %(levelname)s @ %(module)s.%(funcName)s()#%(lineno)d: %(message)s' # ) # ### BEGIN ### Log ### logger_reset() ### # https://realpython.com/primer-on-python-decorators/ # Updated 2022-02-15 def logger_reset(func): # log.setLevel(logging.WARNING) # DEBUG, INFO, WARNING, ERROR, EXCEPTION, CRITICAL # log.info(locals()) @functools.wraps(func) def wrapper(*args, **kwargs): log.info(f'*** Function: "{func.__name__}()"') log.debug(f'*** Function Positional Args: {args}\nFunction Key Args: {kwargs}') init_log_level = log.level returned_result = func(*args, **kwargs) log.debug(f'*** Function finished: "{func.__name__}()". Resetting logger level to level: {log.level} ***') log.setLevel(init_log_level) return returned_result return wrapper # ### END ### Log ### logger_reset() ###