def create_logger(session: Session, name: str, db=True, file=True, console=True): logger = logging.Logger(name) logger.handlers = [] if console: console_handler = logging.StreamHandler() console_handler.setLevel(CONSOLE_LOG_LEVEL) console_handler.stream = sys.stdout logger.handlers.append(console_handler) if file: file_path = os.path.join(LOG_FOLDER, f'{LOG_NAME}.txt') file_handler = RotatingFileHandler(file_path) file_handler.setLevel(FILE_LOG_LEVEL) file_handler.maxBytes = 10485760 file_handler.backupCount = 1 logger.handlers.append(file_handler) if db: handler = DbHandler(session) handler.setLevel(DB_LOG_LEVEL) logger.handlers.append(handler) for h in logger.handlers: fmt = '%(asctime)s.%(msecs)03d %(levelname)s' \ ' %(module)s - %(funcName)s: %(message)s' datefmt = '%Y-%m-%d %H:%M:%S' if isinstance(h, DbHandler): fmt, datefmt = None, None h.formatter = Formatter(fmt=fmt, datefmt=datefmt) # ignore messages from some libraries class NoRunningFilter(logging.Filter): def filter(self, record): return 'ran tasks' not in str(record.msg) for k in logging.root.manager.loggerDict: if 'apscheduler' in k: logging.getLogger(k).setLevel(logging.ERROR) if 'mlcomp' in k: logging.getLogger(k).addFilter(NoRunningFilter()) if 'serializer' in k: logging.getLogger(k).setLevel(logging.ERROR) return logger