Я использую 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. Обратите внимание, ожидается ли это или нет. На скриншоте ниже мы видим:
- сообщения печати с использованием
print
отображаются (позже в файле журнала отStackdriver
) - Сообщения журнала спуска появляются 2 раза. Один с правильной меткой в драйвере стека (DEBUG, INFO, WARNING или ERROR) и еще один со специальным форматированием
[%(levelname)s %(asctime)s %(filename)s:%(lineno)s] %(message)s
, но всегда с меткой ERROR вStackdriver
. - Когда я запускаю код локально, я не вижу дубликатов.
Есть идеи, как правильно настроить эту настройку, чтобы один раз увидеть сообщения журнала (с использованием abseil) с соответствующей «меткой» в Stackdriver
?
----- РЕДАКТИРОВАТЬ --------
- Я вижу проблему локально, а не только при работе на
GCP
. - Повторяющиеся сообщения журнала появляются, когда я добавляю эту строку:
client.setup_logging()
. Раньше у меня не было дубликатов, и все сообщения журнала были в потоке stdout - Если я посмотрю на регистратор
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'])
- Если я посмотрю на:
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, но затем все мои сообщения журнала исчезли.