[英]Unable to log to google stackdriver logging django + gunicorn + nGINX?
[英]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中,每個對象(日志行,時間序列點)都與“資源”(項目中存在的某些事物相關聯,可以配置,可以作為日志的來源)關聯。或時間序列或記錄日志或時間序列的內容)。 如您CloudLoggingHandler
,當省略resource
選項時, CloudLoggingHandler
缺省為global
。
有許多受監視的資源類型 ,包括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靈活的環境的彈性Python運行時 ,如下所示:
def get_project_id():
return os.getenv('GOOGLE_CLOUD_PROJECT')
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.