Ошибка Google Cloud Logging из-за облачной функции

В настоящее время я пытаюсь развернуть облачную функцию, запускаемую Pub / Sub, написанную на Python. Раньше для входа мы использовали loguru. Сейчас я переключаюсь на ведение журнала в облаке. Я думал, что это будет довольно просто, но весьма озадачен. Вот код, который я развернул в облачной функции, просто чтобы попробовать войти:

import base64
import logging
import google.cloud.logging as google_logging

def hello_pubsub(event, context):
     client = google_logging.Client()
     client.setup_logging()
     logging.debug("Starting function")
     logging.info("Hello")

     logging.warning("warning ! ")

     pubsub_message = base64.b64decode(event['data']).decode('utf-8')
     logging.info(pubsub_message)
     logging.error("Exit function")

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

Результирующие журналы на глобальной вкладке

Это результат в "глобальных" журналах. Здесь два вопроса: почему не отображаются журналы отладки, даже если я явно установил уровень журнала как «отладка» в интерфейсе? И почему логи показываются 1, 2 или 3 раза случайным образом?

Теперь я пытаюсь отображать журналы только для моей облачной функции:

Результирующие журналы в журналах Cloud Function для моей функции

Это становится еще хуже, теперь журналы отображаются до 5 раз (и даже не столько раз, как на вкладке «Глобальный»), все уровни информации неверны (logging.info дает 1 информационную строку, 1 строка ошибки; ошибка и предупреждение приводят к 2 строкам ошибок ...)

Я полагаю, что, должно быть, делаю что-то плохое, но не могу понять, что именно, поскольку то, что я пытаюсь сделать, довольно просто. Кто-нибудь может мне помочь? Спасибо !

РЕДАКТИРОВАТЬ: Я допустил ошибку, поместив инициализацию клиента в функцию, это объясняет, что журналы отображались более одного раза. Осталась одна проблема: предупреждения отображаются как ошибки на вкладках «Облачные функции» и правильно отображаются на вкладке «Глобальные». У кого-нибудь есть представление об этом?


person C. Grd    schedule 31.03.2020    source источник


Ответы (2)


Попробуйте переместить настройку за пределы функции:

import base64
import logging
import google.cloud.logging as google_logging

client = google_logging.Client()
client.setup_logging()

def hello_pubsub(event, context):
     logging.debug("Starting function")
     logging.info("Hello")

     logging.warning("warning ! ")

     pubsub_message = base64.b64decode(event['data']).decode('utf-8')
     logging.info(pubsub_message)
     logging.error("Exit function")

Как есть, вы добавляете новые обработчики для каждого запроса на экземпляр.

person Dustin Ingram    schedule 31.03.2020
comment
Спасибо, я думаю, это была причина нескольких сообщений. - person C. Grd; 01.04.2020
comment
Без проблем! Если это решило вашу проблему, не забудьте принять ответ. :) - person Dustin Ingram; 02.04.2020
comment
Это решило половину проблемы, я до сих пор не знаю, почему некоторые журналы отображаются с плохим уровнем информации. - person C. Grd; 02.04.2020

Вам следует использовать интеграцию с модулем ведения журнала Python¶

import logging
import base64
import google.cloud.logging # Don't conflict with standard logging
from google.cloud.logging.handlers import CloudLoggingHandler
client = google.cloud.logging.Client()
handler = CloudLoggingHandler(client)
cloud_logger = logging.getLogger('cloudLogger')
cloud_logger.setLevel(logging.INFO) # defaults to WARN
cloud_logger.addHandler(handler)



def hello_pubsub(event, context):

     import logging
     cloud_logger.debug("Starting function")
     cloud_logger.info("Hello")

     cloud_logger.warning("warning ! ")

     pubsub_message = base64.b64decode(event['data']).decode('utf-8')
     cloud_logger.info(pubsub_message)
     cloud_logger.error("Exit function")

     return 'OK', 200

введите здесь описание изображения

person marian.vladoi    schedule 31.03.2020
comment
Спасибо, я тоже пробовал этот подход, но моя ошибка заключалась в том, что я поместил весь код в функцию, что привело к появлению нескольких сообщений. Теперь это намного лучше, но журналы предупреждений по-прежнему отображаются как ошибки (и правильно отображаются на вкладке «Глобальные». - person C. Grd; 01.04.2020
comment
Журналы, которые вы здесь показываете, взяты из интеграции Cloud Functions по умолчанию с модулем ведения журнала python. Журналы, которые OP видит в 'global', - это журналы, поступающие из CloudLoggingHandler () - person BrainPermafrost; 24.12.2020