向CloudLoggingHandler类提供“资源”参数不起作用

时间:2019-04-20 15:05:41

标签: python django logging google-cloud-platform stackdriver

resource类提供CloudLoggingHandler参数是行不通的,也就是说,它无法登录到stackdriver。如果我将resource注释掉,则可以正常工作。我还尝试了一个不能在Django中运行的简单python脚本,它也可以正常工作。

这实际上是我的Django LOGGING处理程序设置:

'handlers': {
    'stderr': {
        'class': 'google.cloud.logging.handlers.CloudLoggingHandler',
        'name': "name",
        'resource': Resource(
            type="container",
            labels={
                ...
            },
        ),
        'client': google.cloud.logging.Client()
    },
},

没有resource,没问题:

'handlers': {
    'stderr': {
        'class': 'google.cloud.logging.handlers.CloudLoggingHandler',
        'name': "name",
        'client': google.cloud.logging.Client()
    },
},

一个简单的脚本也可以工作:

import logging
import google.cloud.logging # Don't conflict with standard logging
from google.cloud.logging.handlers import CloudLoggingHandler, setup_logging
from google.cloud.logging.resource import Resource

client = google.cloud.logging.Client()
logging.getLogger().setLevel(logging.INFO) # defaults to WARN

res = Resource(
    type="container",
    labels={
       ...
    },
)
handler = CloudLoggingHandler(client, name='name', resource=res)
setup_logging(handler)
logging.error('logging!')

我使用的google-cloud-logging版本是1.10.0。 有人可以提供一些有关调试stackdriver日志记录的建议吗?

1 个答案:

答案 0 :(得分:0)

此问题最有可能是由于资源格式错误而引起的,或者是由于不支持(或不再支持)类型,由于标签与给定类型的标签不匹配,缺少必需的标签或者是因为需要针对特定​​资源类型写日志的特殊权限。

在这种情况下,使用container而不是k8s_container似乎是可疑的。基于this conversation以及Stackdriver Monitoring resource typesStackdriver Logging resource types列表中k8s_container的存在,而container仅记录在后者上,可能是已被k8s_container取代的不推荐使用的资源类型。

如果这不起作用,则编写远程日志的失败应在本地生成日志(或使用background thread transport附带的任何处理程序);尽管这些日志显然更难访问,但如果可以访问这些日志,则应该可以看到尝试写入Stackdriver Logging出了什么问题。