import logging import sys import multiprocessing def setup(): handler = logging.StreamHandler(sys.stdout) handler.lock = multiprocessing.RLock() logging.basicConfig(format='{asctime} | {levelname:8.8} | ' '{name:15.15} | {message}', style='{', handlers=[handler], level=logging.DEBUG) logging.getLogger('').setLevel(logging.ERROR) # Used for the first call, in order to configure logging def _get_logger_with_setup(name): setup() # Swap _get_logger implementation to the setup-less version. global _get_logger _get_logger = _get_logger_without_setup return logging.getLogger(name) # Then this one is used. def _get_logger_without_setup(name): return logging.getLogger(name) _get_logger = _get_logger_with_setup def get_logger(name): logger = _get_logger(name.split('.')[-1]) logger.setLevel(logging.DEBUG) return logger