示例#1
0
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