Как перенаправить сообщения журнала abseil на stackdriver с помощью google.cloud.logging без дублирования с неправильной меткой?

Я использую AI Platform training для выполнения задания по обучению машинному обучению с использованием python 3.7.6. Я использую модуль abseil для регистрации сообщений с absl-py 0.9.0. Я смотрю инструкцию о том, как направлять сообщения журнала Python в конфигурацию средняя статья. Я использую google-cloud-logging 1.15.0. Я написал очень простой код, чтобы понять проблему с моей конфигурацией.

from absl import logging
from absl import flags
from absl import app
import logging as logger
import google.cloud.logging

import sys
import os

FLAGS = flags.FLAGS

def main(argv):

    logging.get_absl_handler().python_handler.stream = sys.stdout

    # Instantiates a client
    client = google.cloud.logging.Client()

    # Connects the logger to the root logging handler; by default this captures
    # all logs at INFO level and higher
    client.setup_logging()

    fmt = "[%(levelname)s %(asctime)s %(filename)s:%(lineno)s] %(message)s"
    formatter = logger.Formatter(fmt)
    logging.get_absl_handler().setFormatter(formatter)

    # set level of verbosity
    logging.set_verbosity(logging.DEBUG)

    print(' 0 print --- ')
    logging.info(' 1 logging:')
    logging.info(' 2 logging:')

    print(' 3 print --- ')
    logging.debug(' 4 logging-test-debug')
    logging.info(' 5 logging-test-info')
    logging.warning(' 6 logging-test-warning')
    logging.error(' 7 logging test-error')
    print(' 8 print --- ')
    print(' 9 print --- ')

if __name__ == '__main__':
    app.run(main)

Сначала отправьте все журналы на stderr. Обратите внимание, ожидается ли это или нет. На скриншоте ниже мы видим:

  1. сообщения печати с использованием print отображаются (позже в файле журнала от Stackdriver)
  2. Сообщения журнала спуска появляются 2 раза. Один с правильной меткой в ​​драйвере стека (DEBUG, INFO, WARNING или ERROR) и еще один со специальным форматированием [%(levelname)s %(asctime)s %(filename)s:%(lineno)s] %(message)s, но всегда с меткой ERROR в Stackdriver.
  3. Когда я запускаю код локально, я не вижу дубликатов.

снимок экрана вывода в GCP stackdriver

Есть идеи, как правильно настроить эту настройку, чтобы один раз увидеть сообщения журнала (с использованием abseil) с соответствующей «меткой» в Stackdriver?

----- РЕДАКТИРОВАТЬ --------

  1. Я вижу проблему локально, а не только при работе на GCP.
  2. Повторяющиеся сообщения журнала появляются, когда я добавляю эту строку: client.setup_logging(). Раньше у меня не было дубликатов, и все сообщения журнала были в потоке stdout
  3. Если я посмотрю на регистратор logger.root.manager.loggerDict.keys(), то вижу их много:
dict_keys(['absl', 'google.auth.transport._http_client', 'google.auth.transport', 'google.auth', 'google','google.auth._default', 'grpc._cython.cygrpc', 'grpc._cython', 'grpc', 'google.api_core.retry', 'google.api_core', 'google.auth.transport._mtls_helper', 'google.auth.transport.grpc', 'urllib3.util.retry', 'urllib3.util', 'urllib3', 'urllib3.connection', 'urllib3.response', 'urllib3.connectionpool', 'urllib3.poolmanager', 'urllib3.contrib.pyopenssl', 'urllib3.contrib', 'socks', 'requests', 'google.auth.transport.requests', 'grpc._common', 'grpc._channel', 'google.cloud.logging.handlers.transports.background_thread', 'google.cloud.logging.handlers.transports', 'google.cloud.logging.handlers', 'google.cloud.logging', 'google.cloud', 'google_auth_httplib2'])
  1. Если я посмотрю на:
root_logger = logger.getLogger()

for handler in root_logger.handlers:
    print("handler ", handler)

Я понимаю:

handler  <ABSLHandler (NOTSET)>
handler  <CloudLoggingHandler <stderr> (NOTSET)>
handler  <StreamHandler <stderr> (NOTSET)>

и мы видим, что поток - это stderr, а не stdout. Мне не удалось это изменить.

Я видел это обсуждение в потоке stackoverflow, и я попробовал последнее решение @Andy Carlson, но затем все мои сообщения журнала исчезли.


person Dr. Fabien Tarrade    schedule 16.05.2020    source источник
comment
1- каково содержание повторяющихся журналов? 2. Не могли бы вы протестировать с помощью стандартной библиотеки Python на платформе AI. обучение и локально, чтобы изолировать проблему?   -  person Khalid K    schedule 19.05.2020
comment
@KhalidK похоже, что все, что идет в регистратор, дублировалось. Если я запустил ту же часть кода client.setup_logging (), тогда все будет работать нормально. Или вывод журнала виден один раз и только в потоке stdout. Итак, client.setup_logging () дублирует сообщения журнала, которые затем появятся как в stdout, так и в stderr.   -  person Dr. Fabien Tarrade    schedule 19.05.2020
comment
Вы имеете в виду, что журналы не дублируются, когда вы запускаете код без client.setup_logging (). Я рекомендую открыть ошибку   -  person Khalid K    schedule 21.05.2020
comment
Только что сделал это проблемой. Ситуация становится еще более запутанной при импорте библиотек Tensorflow и Transformers. Я предполагаю, что это конфликты между logging, absl.logging и google.cloud.logging. Думаю, моя проблема в том, что я действительно не понимаю, как они работают, и предполагаю, что они могут взаимодействовать друг с другом.   -  person Dr. Fabien Tarrade    schedule 22.05.2020