Ошибка при использовании Google Stackdriver Logging в стандартном python App Engine

Мой стек:
Google App Engine Standard
Python (2.7)

Цель:
Чтобы создать именованные журналы в Google Stackdriver Logging, https://console.cloud.google.com/logs/viewer

Документы - Stackdriver Logging: https://google-cloud-python.readthedocs.io/en/latest/logging/usage.html

Код:

from google.cloud import logging as stack_logging
from google.cloud.logging.resource import Resource
import threading

class StackdriverLogging:
    def __init__(self, resource=Resource(type='project', labels={'project_id': 'project_id'}), project_id='project_id'):

    self.resource = resource
    self.client = stack_logging.Client(project=project_id)

    def delete_logger(self, logger_name):
        logger = self.client.logger(logger_name)
        logger.delete()

    def async_log(self, logger_name, sev, msg):
        t = threading.Thread(target=self.log, args=(logger_name, sev, msg,))
        t.start()

    def log(self, logger_name, sev, msg):
        logger = self.client.logger(logger_name)

    if isinstance(msg, str):
        logger.log_text(msg, severity=sev, resource=self.resource)
    elif isinstance(msg, dict):
        logger.log_struct(msg, severity=sev, resource=self.resource)

class hLog(webapp2.RequestHandler):
   def get(self):
      stackdriver_logger = StackdriverLogging()
      stackdriver_logger.async_log("my_new_log", "WARNING", msg="Hello")
      stackdriver_logger.async_log("my_new_log", "INFO", msg="world")

ОШИБКА: обнаружен 1 запрос (-ы) RPC без соответствующего ответа.

Если это невозможно в Google App Engine Standard (Python), каким-либо способом заставить этот код работать:

  from google.cloud import logging
  client = logging.Client()
  # client = logging.Client.from_service_account_json('credentials.json')
  logger = client.logger("my_new_log")
  logger.log_text("hello world") 

Если требуются учетные данные, я предпочитаю использовать учетную запись службы проекта.

Любая помощь будет оценена по достоинству. Спасибо.


comment
пару дней назад просматривал некоторые проблемы с журналированием Python, и тогда я заметил журнал в Stackdriver с именем app. не уверен, откуда взялось имя, но он регистрировался так, как я хотел, с соблюдением уровня журнала и всего остального. ища документы по этому поводу, я наткнулся на следующее: googlecloudplatform.github.io/google-cloud-python/latest/. Я этим не пользовался, но, может быть, это вам поможет?   -  person Randy L    schedule 10.11.2017


Ответы (1)


Я обычно привязываю модуль ведения журнала Python непосредственно к Google Stackdriver Logging. Для этого я создаю модуль log_helper:

from google.cloud import logging as gc_logging
import logging

logging_client = gc_logging.Client()
logging_client.setup_logging(logging.INFO)

from logging import *

Что я затем импортирую в другие файлы, например:

import log_helper as logging

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

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

import log_helper as logging

test_logger = logging.getLogger('test')
test_logger.setLevel(logging.INFO)
test_logger.info('is the name of this logger')

Выход:

ИНФОРМАЦИЯ: тест: имя этого регистратора

person Robbe    schedule 16.11.2017
comment
Это НЕ ПРАВИЛЬНЫЙ ОТВЕТ !, это не касается вопроса создания именованных журналов. - person Brian B; 24.11.2017
comment
@BrianB Именованное ведение журнала довольно просто с модулем ведения журнала по умолчанию. Вы можете использовать разные регистраторы для разных пространств имен. - person Robbe; 24.11.2017
comment
Как бы вы создали именованный журнал с помощью Google App Engine Standard (Python)? - person Brian B; 24.11.2017
comment
Я добавил к ответу пояснение, как создавать именованные журналы. - person Robbe; 27.11.2017