App Engine stackdriver 记录到全局日志而不是服务日志
App Engine stackdriver logging to Global log instead of service log
我正在尝试为在 GAE 上作为 App Engine 服务托管的 django 应用程序设置日志记录。
我已成功设置日志记录,只是日志记录显示在整个项目的全局日志中,而不是该服务的日志中。我希望日志仅显示在特定的服务日志中
这是我的 Django 日志记录配置:
from google.cloud import logging as google_cloud_logging
log_client = google_cloud_logging.Client()
log_client.setup_logging()
LOGGING = {
'version': 1,
'disable_existing_loggers': False,
'handlers': {
'stackdriver_logging': {
'class': 'google.cloud.logging.handlers.CloudLoggingHandler',
'client': log_client
},
},
'loggers': {
'': {
'handlers': ['stackdriver_logging'],
'level': 'INFO',
}
},
}
并且我能够通过这样调用成功登录到全局项目日志:
def fetch_orders(request):
logger.error('test error')
logger.critical('test critical')
logger.warning('test warning')
logger.info('test info')
return redirect('dashboard')
我想弄清楚是否可以将记录器配置为始终将日志用于其 运行 所在的服务。
编辑:
我尝试了下面的建议,但现在它返回以下错误:
Traceback (most recent call last):
File "/env/lib/python3.7/site-packages/google/cloud/logging/handlers/transports/background_thread.py", line 122, in _safely_commit_batch
batch.commit()
File "/env/lib/python3.7/site-packages/google/cloud/logging/logger.py", line 381, in commit
entries = [entry.to_api_repr() for entry in self.entries]
File "/env/lib/python3.7/site-packages/google/cloud/logging/logger.py", line 381, in <listcomp>
entries = [entry.to_api_repr() for entry in self.entries]
File "/env/lib/python3.7/site-packages/google/cloud/logging/entries.py", line 318, in to_api_repr
info = super(StructEntry, self).to_api_repr()
File "/env/lib/python3.7/site-packages/google/cloud/logging/entries.py", line 241, in to_api_repr
info["resource"] = self.resource._to_dict()
AttributeError: 'ConvertingDict' object has no attribute '_to_dict'
我可以在包源代码中覆盖它以使其工作,但是 GAE 环境要求我使用 google 提供的包进行云日志记录。从这里有什么路可以走吗?
据我了解,使用 CloudLoggingHandler 的 resource
选项应该可以完成您想要的。在 Stackdriver Logging(和 Stackdriver Monitoring)API 中,每个对象(日志行,time-series 点)都与一个 "resource"(项目中存在的东西,可以配置,并且可以是日志或 time-series 的来源或日志或 time-series 所写的内容)。当省略 resource
选项时,CloudLoggingHandler
默认为 global
,如您所见。
有许多monitored resource types,包括gae_app
,可用于表示部署在GAE 上的特定服务的特定版本。根据您的代码,这看起来像:
from google.cloud.logging import resource
def get_monitored_resource():
project_id = get_project_id()
gae_service = get_gae_service()
gae_service_version = get_gae_service_version()
resource_type = 'gae_app'
resource_labels = {
'project_id': project_id,
'module_id': gae_service,
'version_id': gae_service_version
}
return resource.Resource(resource_type, resource_labels)
GAE_APP_RESOURCE = get_monitored_resource()
LOGGING = {
# ...
'handlers': {
'stackdriver_logging': {
'class': 'google.cloud.logging.handlers.CloudLoggingHandler',
'client': log_client,
'resource': GAE_APP_RESOURCE,
},
},
# ...
}
上述代码中,函数get_project_id
、get_gae_service
、get_gae_service_version
可以通过环境变量GOOGLE_CLOUD_PROJECT
、GAE_SERVICE
实现和 GAE_VERSION
在 Python 灵活环境中,如 The Flexible Python Runtime 所述,如:
def get_project_id():
return os.getenv('GOOGLE_CLOUD_PROJECT')
我正在尝试为在 GAE 上作为 App Engine 服务托管的 django 应用程序设置日志记录。
我已成功设置日志记录,只是日志记录显示在整个项目的全局日志中,而不是该服务的日志中。我希望日志仅显示在特定的服务日志中
这是我的 Django 日志记录配置:
from google.cloud import logging as google_cloud_logging
log_client = google_cloud_logging.Client()
log_client.setup_logging()
LOGGING = {
'version': 1,
'disable_existing_loggers': False,
'handlers': {
'stackdriver_logging': {
'class': 'google.cloud.logging.handlers.CloudLoggingHandler',
'client': log_client
},
},
'loggers': {
'': {
'handlers': ['stackdriver_logging'],
'level': 'INFO',
}
},
}
并且我能够通过这样调用成功登录到全局项目日志:
def fetch_orders(request):
logger.error('test error')
logger.critical('test critical')
logger.warning('test warning')
logger.info('test info')
return redirect('dashboard')
我想弄清楚是否可以将记录器配置为始终将日志用于其 运行 所在的服务。
编辑:
我尝试了下面的建议,但现在它返回以下错误:
Traceback (most recent call last):
File "/env/lib/python3.7/site-packages/google/cloud/logging/handlers/transports/background_thread.py", line 122, in _safely_commit_batch
batch.commit()
File "/env/lib/python3.7/site-packages/google/cloud/logging/logger.py", line 381, in commit
entries = [entry.to_api_repr() for entry in self.entries]
File "/env/lib/python3.7/site-packages/google/cloud/logging/logger.py", line 381, in <listcomp>
entries = [entry.to_api_repr() for entry in self.entries]
File "/env/lib/python3.7/site-packages/google/cloud/logging/entries.py", line 318, in to_api_repr
info = super(StructEntry, self).to_api_repr()
File "/env/lib/python3.7/site-packages/google/cloud/logging/entries.py", line 241, in to_api_repr
info["resource"] = self.resource._to_dict()
AttributeError: 'ConvertingDict' object has no attribute '_to_dict'
我可以在包源代码中覆盖它以使其工作,但是 GAE 环境要求我使用 google 提供的包进行云日志记录。从这里有什么路可以走吗?
据我了解,使用 CloudLoggingHandler 的 resource
选项应该可以完成您想要的。在 Stackdriver Logging(和 Stackdriver Monitoring)API 中,每个对象(日志行,time-series 点)都与一个 "resource"(项目中存在的东西,可以配置,并且可以是日志或 time-series 的来源或日志或 time-series 所写的内容)。当省略 resource
选项时,CloudLoggingHandler
默认为 global
,如您所见。
有许多monitored resource types,包括gae_app
,可用于表示部署在GAE 上的特定服务的特定版本。根据您的代码,这看起来像:
from google.cloud.logging import resource
def get_monitored_resource():
project_id = get_project_id()
gae_service = get_gae_service()
gae_service_version = get_gae_service_version()
resource_type = 'gae_app'
resource_labels = {
'project_id': project_id,
'module_id': gae_service,
'version_id': gae_service_version
}
return resource.Resource(resource_type, resource_labels)
GAE_APP_RESOURCE = get_monitored_resource()
LOGGING = {
# ...
'handlers': {
'stackdriver_logging': {
'class': 'google.cloud.logging.handlers.CloudLoggingHandler',
'client': log_client,
'resource': GAE_APP_RESOURCE,
},
},
# ...
}
上述代码中,函数get_project_id
、get_gae_service
、get_gae_service_version
可以通过环境变量GOOGLE_CLOUD_PROJECT
、GAE_SERVICE
实现和 GAE_VERSION
在 Python 灵活环境中,如 The Flexible Python Runtime 所述,如:
def get_project_id():
return os.getenv('GOOGLE_CLOUD_PROJECT')