Отправка журналов в GCP из приложения Django DRF

Я пытаюсь получить доступ к журналам из моего приложения django в GCP logging. До сих пор я не смог добиться успеха.

Вот моя конфигурация протоколирования:

 client = gcp_logging.Client.from_service_account_json(
        json_credentials_path='logging_service_account.json')

    client.setup_logging()

    LOGGING = {
        'version': 1,
        'disable_existing_loggers': False,
        'formatters': {
            'standard': {'format': '%(levelname)s : %(message)s - [in %(pathname)s:%(lineno)d]'},
            'short': {'format': '%(message)s'}
        },
        'handlers': {
            'stackdriver': {
                'formatter': 'standard',
                'class':  'google.cloud.logging.handlers.CloudLoggingHandler',
                'client': client
            },
            'requestlogs_to_stdout': {
                'class': 'logging.StreamHandler',
                'filters': ['request_id_context'],
            }
        },
        'filters': {
            'request_id_context': {
                '()': 'requestlogs.logging.RequestIdContext'
            }
        },
        'loggers': {
            'StackDriverHandler': {
                'handlers': ['stackdriver'],
                'level': "DEBUG"
            },
            'django.request': {
                'handlers': ['stackdriver']
            },
            'requestlogs': {
                'handlers': ['requestlogs_to_stdout'],
                'level': 'INFO',
                'propagate': False,
            },
        },
    }

Я вызываю журналы следующим образом:


import logging
logger = logging.getLogger('StackDriverHandler')
class OrganisationDetail(generics.RetrieveUpdateDestroyAPIView):
  ///

    def patch(self, request, pk, format=None):
        try:
            ///
            if serializer.is_valid():
                serializer.save()
                logger.info(f"PATCH SUCCESSFUL: {serializer.data}")
                return Response(serializer.data)
            logger.warning(f"PATCH Failed: {serializer.errors}")
            return JsonResponse(serializer.errors, status=400)
        except Exception as e:
            logger.error(f"PATCH Failed with exception: {e}")
            return JsonResponse({'error': str(e)}, status=500)

В GCP я настроил учетную запись службы, включил протоколирование api и дал SA права на запись журналов и мониторинг метрик.

Затем я создал секрет, содержащий мой ключ service_account, и в моем файле cloud-build.yaml я выполнил следующий шаг:

- name: gcr.io/cloud-builders/gcloud
  entrypoint: 'bash'
  args: [ '-c', "gcloud secrets versions access latest --secret=<secret_name> --format='get(payload.data)' | tr '_-' '/+' | base64 -d > logging_service_account.json" ]

Вышеуказанный шаг должен:

  1. Получаем секрет
  2. Записываем его в json файл в контейнере экземпляра приложения, который может быть доступен в моем файле settings.py с помощью gcp_logging.Client.from_service_account_json( json_credentials_path='logging_service_account.json')
  3. .

Возможно, есть более прямой способ добиться этого, но мне кажется, что это должно работать. Любая помощь будет очень признательна. Спасибо

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

Чтобы ответить на ваш вопрос, нам нужна дополнительная информация. Вы убедились, что успешно создали клиента?

client = gcp_logging.Client.from_service_account_json(
        json_credentials_path='logging_service_account.json')

Вызывает ли вызов from_service_account_json() исключение?

from google.cloud.logging import Client                                  

try:                                                                                  
    client = Client.from_service_account_json(SERVICE_KEY_PATH)
except Exception as e:                                                                
    print(e)                                                                     

Успешно ли вы получили JSON-файл?

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

gcloud auth application-default login

Тогда вам нужно:

from google.cloud.logging import Client                                  
client = Client()

Вы показали объект LOGGING. Он используется Django, но не используется вызовом client.setup_logging(). Вот полный пример работающего кода:

import logging
from google.cloud.logging import Client

try:                                                                                  
    client = Client()
    client.setup_logging()
except Exception as e:
  print(e)
logger = logging.getLogger(__name__)
logger.info("PATCH SUCCESSFUL")
logger.warning("PATCH Failed")
logger.error("PATCH Failed with exception")
Вернуться на верх