我正在尝试从 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" ]
上述步骤应该:
gcp_logging.Client.from_service_account_json( json_credentials_path='logging_service_account.json')
也许有一种更直接的方法来实现这一目标,但感觉它应该有效。任何帮助将非常感激。谢谢
完成上述所有步骤后,当我在 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")