Облачные функции Google Python Logging проблема - PullRequest
0 голосов
/ 11 января 2019

Я не уверен, как это сказать, но я чувствую, что под капотом есть что-то, что было изменено Google без моего ведома об этом. Раньше я получал журналы от своих облачных функций python в консоли Google Cloud на панели инструментов журналов. И теперь он просто перестал работать.

Так что я долго занимался исследованиями, я просто сделал журнал hello world python Cloud Function:

import logging

def cf_endpoint(req):
    logging.debug('log debug')
    logging.info('log info')
    logging.warning('log warning')
    logging.error('log error')
    logging.critical('log critical')
    return 'ok'

Итак, это мой main.py, который я развернул как облачную функцию с http-триггером.

Так как у меня был фильтр исключения приема журналов со всеми журналами уровня «отладки», я ничего не видел на панели мониторинга журналов. Но когда я удалил его, я обнаружил это:

logging dashboard screenshot

Так что, похоже, что то, что анализировало встроенные записи журнала python в stackdriver, перестало анализировать параметр серьезности журнала! Извините, если выгляжу глупо, но это единственное, о чем я могу думать: /

У вас, ребята, есть объяснения или решения для этого? я делаю это неправильно?

Заранее благодарю за помощь.

Ответы [ 2 ]

0 голосов
/ 08 мая 2019

Я столкнулся с той же проблемой.

По ссылке, которой поделилась @joan Grau, я также вижу способ интеграции облачного регистратора с модулем ведения журнала Python, чтобы вы могли использовать корневой регистратор Python, как обычно, и все журналы будут отправляться в StackDriver Logging.

https://googleapis.github.io/google-cloud-python/latest/logging/usage.html#integration-with-python-logging-module

...

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

Один простой способ привязать облачный регистратор к корневому журналу

from google.cloud import logging as cloudlogging
import logging
lg_client = cloudlogging.Client()
lg_client.setup_logging(log_level=logging.INFO) # to attach the handler to the root Python logger, so that for example a plain logging.warn call would be sent to Stackdriver Logging, as well as any other loggers created.

В качестве альтернативы, вы можете установить регистратор с более точным контролем

from google.cloud import logging as cloudlogging
import logging
lg_client = cloudlogging.Client()

lg_handler = lg_client.get_default_handler()
cloud_logger = logging.getLogger("cloudLogger")
cloud_logger.setLevel(logging.INFO)
cloud_logger.addHandler(lg_handler)
cloud_logger.info("test out logger carrying normal news")
cloud_logger.error("test out logger carrying bad news")
0 голосов
/ 11 февраля 2019

Stackdriver Фильтры важности ведения журнала больше не поддерживаются при использовании собственного модуля Python logging .

Тем не менее, вы все еще можете создавать журналы с определенной степенью серьезности, используя Stackdriver Logging Client Libraries . Проверьте эту документацию в отношении библиотек Python и эту для некоторых примеров использования.

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

В качестве примера следующий код запишет журнал в ресурс облачной функции в журнале Stackdriver с серьезностью ERROR:

from google.cloud import logging
from google.cloud.logging.resource import Resource

log_client = logging.Client()

# This is the resource type of the log
log_name = 'cloudfunctions.googleapis.com%2Fcloud-functions' 

# Inside the resource, nest the required labels specific to the resource type
res = Resource(type="cloud_function", 
               labels={
                   "function_name": "YOUR-CLOUD-FUNCTION-NAME", 
                   "region": "YOUR-FUNCTION-LOCATION"
               },
              )
logger = log_client.logger(log_name.format("YOUR-PROJECT-ID"))
logger.log_struct(
 {"message": "message string to log"}, resource=res, severity='ERROR')

return 'Wrote logs to {}.'.format(logger.name) # Return cloud function response

Обратите внимание, что строки в YOUR-CLOUD-FUNCTION-NAME, YOUR-FUNCTION-LOCATION и YOUR-PROJECT-ID должны соответствовать вашему проекту / ресурсу.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...