import logging import inspect import sys from pathlib import Path log_format = "[%(asctime)-12s-%(levelname)s] (%(name)s) %(message)s" def get_logger(logger_name: str = None, log_level: str = 'info') -> logging.Logger: # Set up levels log_levels = logging._nameToLevel log_level = log_levels[log_level.upper()] # Set up logger format logger_name = logger_name or Path(inspect.getmodule(inspect.stack()[1][0]).__file__).name logger = logging.getLogger(logger_name.rstrip('.py')) logger.setLevel(log_level) formatter = logging.Formatter(fmt = log_format) handler = logging.StreamHandler(sys.stdout) handler.setFormatter(formatter) # Set up exception hook if logger_name == 'main': def exception_hook(*args): gettrace = getattr(sys, 'gettrace', None) if not gettrace(): logger.error('Uncaught exception:') logger.exception(args[-1], exc_info=args) sys.excepthook = exception_hook # Add handler to logger logger.addHandler(handler) logger.info(f"Created {logger = }") return logger