Ведение журнала стека приложений App Engine в глобальном журнале вместо журнала службы - PullRequest
1 голос
/ 23 мая 2019

Я пытаюсь настроить ведение журнала для приложения django, размещенного в качестве службы App Engine в GAE.

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

Это моя конфигурация ведения журнала django:

from google.cloud import logging as google_cloud_logging


log_client = google_cloud_logging.Client()
log_client.setup_logging()

LOGGING = {
    'version': 1,
    'disable_existing_loggers': False,
    'handlers': {
        'stackdriver_logging': {
            'class': 'google.cloud.logging.handlers.CloudLoggingHandler',
            'client': log_client
        },
    },
    'loggers': {
        '': {
            'handlers': ['stackdriver_logging'],
            'level': 'INFO',
        }
    },
}

И я могу успешно войти в Глобальный журнал проекта с помощьюзвоните так:

def fetch_orders(request):
    logger.error('test error')
    logger.critical('test critical')
    logger.warning('test warning')
    logger.info('test info')
    return redirect('dashboard')

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

РЕДАКТИРОВАТЬ:

Я попробовал приведенное ниже предложение, однако теперь оно возвращает следующую ошибку:

Traceback (most recent call last):
  File "/env/lib/python3.7/site-packages/google/cloud/logging/handlers/transports/background_thread.py", line 122, in _safely_commit_batch
    batch.commit()
  File "/env/lib/python3.7/site-packages/google/cloud/logging/logger.py", line 381, in commit
    entries = [entry.to_api_repr() for entry in self.entries]
  File "/env/lib/python3.7/site-packages/google/cloud/logging/logger.py", line 381, in <listcomp>
    entries = [entry.to_api_repr() for entry in self.entries]
  File "/env/lib/python3.7/site-packages/google/cloud/logging/entries.py", line 318, in to_api_repr
    info = super(StructEntry, self).to_api_repr()
  File "/env/lib/python3.7/site-packages/google/cloud/logging/entries.py", line 241, in to_api_repr
    info["resource"] = self.resource._to_dict()
AttributeError: 'ConvertingDict' object has no attribute '_to_dict'

Я могу переопределить это в исходном коде пакета, чтобы оно заработало, однако среда GAE требует, чтобы яиспользуйте пакет, предоставленный Google, для регистрации в облаке.Есть ли какой-нибудь путь отсюда?

1 Ответ

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

Насколько я понимаю, должно быть возможно выполнить то, что вы хотите, используя параметр resource CloudLoggingHandler .В API ведения журнала Stackdriver (и Stackdriver Monitoring) каждый объект (строка журнала, точка временного ряда) связан с «ресурсом» (кое-что, что существует в проекте, которое может быть подготовлено и может быть источником журналов).или временной ряд или вещь, о которой пишутся журналы или временные ряды).Если опция resource не указана, то по умолчанию CloudLoggingHandler устанавливается на global.

Существует несколько отслеживаемых типов ресурсов , включая gae_app, которыеможет использоваться для представления конкретной версии конкретной службы, развернутой в GAE.Исходя из вашего кода это будет выглядеть примерно так:

from google.cloud.logging import resource


def get_monitored_resource():
  project_id = get_project_id()
  gae_service = get_gae_service()
  gae_service_version = get_gae_service_version()
  resource_type = 'gae_app'
  resource_labels = {
    'project_id': project_id,
    'module_id': gae_service,
    'version_id': gae_service_version
  }
  return resource.Resource(resource_type, resource_labels)


GAE_APP_RESOURCE = get_monitored_resource() 
LOGGING = {
    # ...
    'handlers': {
        'stackdriver_logging': {
            'class': 'google.cloud.logging.handlers.CloudLoggingHandler',
            'client': log_client,
            'resource': GAE_APP_RESOURCE,
        },
    },
    # ...
}

В приведенном выше коде функции get_project_id, get_gae_service и get_gae_service_version могут быть реализованы в терминах переменных среды GOOGLE_CLOUD_PROJECT, GAE_SERVICE и GAE_VERSION в гибкой среде Python, как описано в Flexible Python Runtime как в:

def get_project_id():
  return os.getenv('GOOGLE_CLOUD_PROJECT')
...