【问题标题】:App Engine stackdriver logging to Global log instead of service logApp Engine 堆栈驱动程序记录到全局日志而不是服务日志
【发布时间】:2019-10-10 09:18:55
【问题描述】:

我正在尝试为在 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 提供的包来进行云日志记录。有什么办法可以从这里出发吗?

【问题讨论】:

    标签: django google-app-engine logging stackdriver


    【解决方案1】:

    据我了解,使用CloudLoggingHandlerresource 选项应该可以完成您想要的操作。在 Stackdriver Logging(和 Stackdriver Monitoring)API 中,每个对象(日志行、时间序列点)都与一个“资源”(项目中存在的、可以配置的、可以作为日志来源的东西)相关联或时间序列或正在写入日志或时间序列的事物)。当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_idget_gae_serviceget_gae_service_version可以在Python柔性环境中根据环境变量GOOGLE_CLOUD_PROJECTGAE_SERVICEGAE_VERSION实现,如文档所述The Flexible Python Runtime 如:

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

    【讨论】:

    • 新问题,你介意看看上面的错误吗?
    • 您似乎使用了错误的资源定义;在此处查看该类:github.com/googleapis/google-cloud-python/blob/master/logging/… 请注意,该类具有方法“_to_dict()”,错误表明它没有。听起来您可能传入了其他一些对象作为资源?
    • 看起来这与 Django 具体有关。 ConvertingDict / ConvertingTuple 是我发现的 Django 的一部分。我不知道为什么,但它需要 Resource 对象并尝试将其视为这些对象之一。设置是正确的,但 Django 只想覆盖它。我可以直接修改库,但 GAE 需要使用 google-cloud-logging 包,所以这也不是一个选项。我想我会接受它,并暂时在全局日志中设置一个自定义过滤器
    • 我认为你是对的。在放弃之前,尝试做你对“stackdriver_logging”条目所做的事情;不要传入资源对象,而是尝试传入一个字典,其中有一个“类”条目,它给出了“资源”类的完全限定名称;也许这会自动转换为 Resource 对象?
    • 或者:您可以尝试直接添加日志处理程序,而不是尝试通过特殊的“LOGGING”配置字典(例如,通过检索记录器然后显式调用“addHandler”方法来注册处理程序)。
    猜你喜欢
    • 1970-01-01
    • 2019-04-16
    • 1970-01-01
    • 2020-05-06
    • 2019-01-11
    • 2023-04-08
    • 2016-07-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多