从 Django DRF 应用程序将日志发送到 GCP

问题描述 投票:0回答:1

我正在尝试从 GCP 日志记录中的 django 应用程序访问日志。到目前为止我还没有成功。

这是我的日志配置:

 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 应用程序的日志。

django google-cloud-platform django-rest-framework stackdriver google-cloud-logging
1个回答
0
投票

为了回答您的问题,我们需要更多信息。 您确认客户端创建成功了吗?

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")
© www.soinside.com 2019 - 2024. All rights reserved.