簡體   English   中英

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提供的程序包進行雲日志記錄。 有什么辦法可以從這里走嗎?

據我了解,應該可以使用CloudLoggingHandlerresource選項完成您想要的事情 在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_idget_gae_serviceget_gae_service_version可以在該環境變量的角度來實施GOOGLE_CLOUD_PROJECTGAE_SERVICEGAE_VERSION如記錄由在Python靈活的環境的彈性Python運行時 ,如下所示:

def get_project_id():
  return os.getenv('GOOGLE_CLOUD_PROJECT')

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM