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
相关产品推荐
相关产品推荐

