You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Django DRF应用日志无法发送至GCP Logging求助

Django DRF 接入GCP Logging 失败排查求助

问题描述

尝试将Django DRF应用日志接入GCP Logging,完成所有配置后,GCP控制台仅能看到服务账号创建的日志,无法看到应用本身的业务日志。

日志配置(settings.py)

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端已完成配置

  • 创建服务账号,启用Logging API,赋予写入日志和监控指标权限
  • 将服务账号密钥存入Secret Manager,通过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" ]

排查建议

  • 验证密钥文件有效性:在cloud-build步骤中添加cat logging_service_account.json命令,确认密钥内容完整、格式正确;同时在settings.py中通过import os; print(os.path.exists('logging_service_account.json'))检查文件路径是否正确。
  • 避免配置冲突:注释掉client.setup_logging(),该方法会自动配置默认日志handler,可能覆盖或干扰自定义的LOGGING配置。
  • 确认日志级别生效:在日志调用代码中添加print(logger.getEffectiveLevel()),检查当前logger的有效级别是否允许INFO及以上日志输出(DEBUG=10、INFO=20、WARNING=30、ERROR=40)。
  • 添加日志传播控制:在StackDriverHandler的logger配置中加入'propagate': False,避免日志被其他默认handler捕获而未发送到GCP。
  • 检查GCP日志过滤器:在GCP Logging控制台使用精准过滤器,例如指定日志项目和日志名称:logName="projects/[你的项目ID]/logs/StackDriverHandler",避免因过滤器规则错误导致日志未显示。

内容的提问来源于stack exchange,提问作者Che Coelho

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.02 15:30:22