Python: Почему он отправляет дубликаты журналов в Stackdriver? - PullRequest
0 голосов
/ 05 августа 2020

Я отправляю журналы, созданные из моего конвейера данных, в Stackdriver на GCP. Но по какой-то причине он отправляет несколько дубликатов одних и тех же журналов событий. В моей функции ensure_stackdriver_logging я проверяю, существует ли уже обработчик, чтобы предотвратить ситуацию, когда при повторном запуске task обработчик не будет добавлен несколько раз. Кто-нибудь знает, в чем проблема?

def ensure_stackdriver_logging():
    logger = get_logger()
    lg_client = google.cloud.logging.Client()
    lg_handler = CloudLoggingHandler(lg_client, 'thinknum_etl_logging')
    if lg_handler not in logger.handlers:
        formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
        lg_handler.setFormatter(formatter)
        logger.setLevel(logging.INFO)
        logger.addHandler(lg_handler)


def task():
    ensure_stackdriver_logging()
    ...

Обновление:

Я тоже пробовал -

def ensure_stackdriver_logging():
    logger = get_logger()

    if hasattr(logger, 'initialized'):
        return logger
    else:
        setattr(logger, 'initialized', True)

    lg_client = google.cloud.logging.Client()
    lg_handler = CloudLoggingHandler(lg_client, 'thinknum_etl_logging')
    formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
    lg_handler.setFormatter(formatter)
    logger.setLevel(logging.INFO)
    logger.addHandler(lg_handler)

Но это не сработало.

1 Ответ

0 голосов
/ 05 августа 2020

Если вы вызываете метод ensure_stackdriver_logging() в другом месте или даже ранее добавляли обработчик журнала, это произойдет дважды (или чаще), потому что ваша проверка if не работает должным образом.

Когда вы выполняете проверку if lg_handler not in logger.handlers:, выполняется сравнение между идентификатором объекта lg_handler и другими объектами в списке, но поскольку вы только что создали lg_handler в строке перед списком, это не будет в списке.

Возьмите это в качестве примера:

class Foo():
    pass

l = [Foo()]
b = Foo()
print(b in l)
>>> False

b отсутствует в списке, потому что тот объект, на который указывает b, отсутствует в списке, но скорее объект Foo, имеющий те же значения.

...