GAE - Python 3.7 - Как войти? - PullRequest
       7

GAE - Python 3.7 - Как войти?

0 голосов
/ 30 октября 2018

У меня есть проект Google App Engine на Python 3.7, в котором я хотел бы написать несколько журналов. Я привык программировать в python 2.7 движка приложений и использовал простой код:

 logging.info('hi there!')

для записи любого журнала в консоль журнала Google Cloud. Эта команда выше больше не работает и говорит:

logging has no attribute 'info'

Я искал и нашел этот возможный новый код

from flask import Flask
from google.cloud import logging

app = Flask(__name__)

@app.route('/l')
def hello():
    logging_client = logging.Client()
    log_name = LOG_NAME
    logger = logging_client.logger(LOG_NAME)
    text = 'Hello, world!'
    logger.log_text(text, severity='CRITICAL')
    return text

Приведенный выше код не выдает никакой ошибки на странице отчета драйвера стека, НО на странице журнала ничего не отображается.

Так, как я могу написать журнал для своего проекта движка приложения в python3.7?

Ответы [ 2 ]

0 голосов
/ 31 октября 2018

Стандартное окружение второго поколения (которое включает в себя Python 3.7) ИМХО ближе к гибкой среде, чем к стандартному окружению первого поколения (которое включает в себя Python 2.7).

Многие из API, которые имели настроенные версии для 1-го поколения (поддерживаемые командой GAE), не были (или, по крайней мере, пока) не портированы во 2-м поколении, если соответствующая функциональность была более или менее охвачена альтернативным, более общим подходы, уже используемые в гибкой среде (большинство из них основано на услугах, разработанных и поддерживаемых командами, отличными от GAE).

Вы заметите сходство между многими разделами службы в этих двух руководствах по миграции (что привело меня к приведенному выше краткому выводу):

Регистрация - это одна из служб, перечисленных в обоих руководствах. В первом поколении использовалась настроенная версия стандартной библиотеки python logging (это было до того, как Stackdriver стал автономной службой). Для 2-го поколения ведение журнала было просто делегировано для использования теперь общедоступной службы Stackdriver logging (именно из этого взят фрагмент, который вы показали). Из журнала (в 1-м руководстве):

Журналы запросов больше не коррелируются автоматически, но будут появляются в журнале Stackdriver. Используйте клиент регистрации Stackdriver библиотеки для реализации желаемого поведения ведения журнала.

Фрагмент кода, который вы показываете, действительно соответствует регистрации в Stackdriver. Но вы, похоже, используете клиентскую библиотеку напрямую. Я не знаю, если это проблема (GAE часто немного отличается), но, возможно, вы также можете попробовать , используя вместо этого стандартное ведение журнала Python :

Чтобы отправить все записи журнала в Stackdriver, подключив Stackdriver Обработчик входа в корневую учетную запись Python, используйте setup_logging вспомогательный метод:

# Imports the Google Cloud client library
import google.cloud.logging

# 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()

Как только обработчик присоединен, любые журналы по умолчанию на уровне INFO или выше, которые указаны в вашей заявке, будет отправлен Регистрация в стеке:

# Imports Python standard library logging
import logging

# The data to log
text = 'Hello, world!'

# Emits the data using the standard logging module
logging.warn(text)

Там также есть некоторые специфичные для GAE заметки (но я не уверен, что они также охватывают стандартное env 2-го поколения):

Google App Engine по умолчанию предоставляет роль средства записи журналов .

Библиотека журналов Stackdriver для Python может использоваться без необходимости явно предоставить учетные данные.

Ведение журнала Stackdriver автоматически включается для App Engine Приложения. Никаких дополнительных настроек не требуется.

Примечание : Журналы, записанные в stdout и stderr , автоматически отправляются в Stackdriver Logging за вас, без необходимости использования Библиотека журналов Stackdriver для Python.

Возможно, стоит отметить, что просмотр журналов , вероятно, будет отличаться и за пределами стандартного env 1-го поколения (где журналы приложений будут аккуратно соотнесены с журналами запросов).

А также Использование регистрации в Stackdriver в приложениях App Engine . В нем конкретно не упоминается стандартная среда env 2-го поколения (поэтому может потребоваться обновление), но есть полезные советы для гибкой среды, которая может быть полезной. Например, Связывание журналов приложений и запросов раздел может представлять интерес, если корреляция отсутствующих журналов запросов имеет какое-либо отношение к этому.

0 голосов
/ 31 октября 2018

Несмотря на то, что ведение журнала работает по-разному в Python 2.7 и 3.7, тот же метод ведения журнала, который предусмотрен в Чтение и запись журналов приложений в Python 2.7 , также должен работать для Python 3.7, поскольку журналы, записанные в stdout и stderr, будут все еще появляются в журнале Stackdriver.

Import logging

logging.getLogger().setLevel(logging.DEBUG)
logging.debug('This is a debug message')

logging.getLogger().setLevel(logging.INFO)
logging.info('This is an info message')
logging.warning('This is a warning message')
logging.error('This is an error message')
logging.critical('This is a critical message')
#logging.warn is deprecated
logging.warn('This is a warning' message)

=======================================

Import logging

app.logger.setLevel(logging.ERROR)
app.logger.error('This is an error message')

Однако записи журнала больше не соотносятся с запросами автоматически, как в Python 2.7, поэтому вы видите их в виде простого текста. Я создал запрос функции для решения этой проблемы, который вы можете выполнить здесь .

...