Sco*_*ott 12 google-cloud-logging google-cloud-functions
我有一个与谷歌存储和谷歌日志记录集成的 python 3.7 谷歌云函数,因此我使用该函数部署了一个密钥文件,并使用 GOOGLE_APPLICATION_CREDENTIALS 环境变量引用它。一切都工作正常,因为我的函数执行了它应该做的事情并返回正确的输出等,唯一需要注意的是它正在将错误级别的内容记录到看起来应该是 INFO 或更低的级别。或者...也许我错过了一些东西,但我不想在这里错过一些东西。
底线:我想要干净的日志,以便错误/警告有意义,并且我不必处理噪音。
您会注意到,我自己的日志记录显示在“调试”级别,但在它之前和之后是看似无害的日志条目,被标记为“错误”。(是的,我知道我自己的日志条目出现了 2 次,一次在调试时,一次在信息处 - 这是另一个问题,但对我来说优先级较低。)
这对于谷歌云功能来说是正常现象吗?或者我可以做些什么来纠正这个问题?
更新:
以下是我在 python 代码中配置日志记录的方法:
import logging
import logging.config
import google.cloud.logging
client = google.cloud.logging.Client()
client.get_default_handler()
client.setup_logging()
logging.getLogger().setLevel(logging.DEBUG)
Run Code Online (Sandbox Code Playgroud)
现在,我注意到在本地调试(使用函数框架)中,我也将这些相同的消息输出到控制台,而没有任何日志条目元数据,因此通过谷歌客户端代码进行跟踪,我注意到客户端代码只是使用python 日志库,当它们在调试时输出这些消息时,它们以某种方式绕过了我期望在这里使用的 google 日志钩子。因此它们被输出到 stderr,当然谷歌的日志记录将其解释为错误。
这并没有回答我自己的问题,而是添加了更多上下文,希望其他人已经解决了这个问题。
更新 #2 - 一个丑陋的解决方案,需要一个更好的解决方案
在对谷歌云客户端代码进行了更多挖掘之后,我得到了答案,尽管我不喜欢它,也不喜欢我正在做的“修复”这个问题。
发生的事情是,当该函数在 GCP 中部署并运行时,Python 日志记录框架会以某种方式使用其他处理程序进行初始化。调用 client.setup_logging() 后,如果我打印出附加到根记录器的处理程序,我会看到:
root handlers=[<StreamHandler (NOTSET)>, <StreamHandler (WARNING)>, <CloudLoggingHandler (NOTSET)>]
Run Code Online (Sandbox Code Playgroud)
接下来,为了让事情变得更有趣,当调用 setup_logging() 时,有一些“排除的记录器”硬编码到客户端代码中,以将它们排除在使用 CloudLoggingHandler 之外(有一条注释指出,如果不这样做,我们就会请参阅无限递归)。因此,使用这些特定于 google 的记录器记录的任何内容都将始终转到我上面捕获的 StreamHandler 之一或两个。
AND,最后的解释:StreamHandler 使用的默认流是 stderr,谷歌的日志报告正确地(恕我直言)将其解释为“错误”。
因此,有了这个解释,我至少可以在我自己的函数类中使用以下代码来解决这个问题:
import logging
import google.cloud.logging
client = google.cloud.logging.Client()
client.setup_logging() # NOTE specifying logger_level here sets only the root logger which I'll reset below
logging.getLogger().setLevel(logging.INFO)
# Now I must configure my individual loggers to allow for debug
_LOGGER = logging.getLogger(__name__)
_LOGGER.setLevel(logging.DEBUG)
Run Code Online (Sandbox Code Playgroud)
这样做的目的是对那些谷歌记录器隐藏调试,然后他们在 INFO 或更高级别记录的任何内容仍然会显示为错误(由于 stderr 输出),然后我必须记住将我自己的记录器配置为 DEBUG,其中我希望该级别的日志记录生效。
现在,我为什么不喜欢这个呢?为什么我不在这里回答我自己的问题?因为这是一个 hacky 解决方案,要求我了解 google 客户端代码和日志记录的内部结构。它不直观,并且不允许我使用根记录器作为我想要在整个软件中级联的默认值。
因此,我仍然想看看是否有我缺少的更好的解决方案,所以我将这个问题悬而未决。
小智 12
您是对的,从云功能运行云日志客户端库时,不会考虑应绘制为黄色和绿色条目的警告和调试等日志级别。
我发现这已经在这个公共问题跟踪器中向 Google 报告了。
他们讨论的一些最重要的观点是:
症状:如果不使用 Stackdriver API,则无法从 Cloud Functions 指定 Stackdriver 日志严重性。例如logging.debug('日志调试')、logging.info('日志信息')、logging.warning('日志警告')、logging.error('日志错误')和logging.ritic('日志关键' )都将创建具有填充不足的严重性条目的 Stackdriver 日志。
答:云函数PM这里。我们已经意识到这个问题并正在研究长期解决方案。我们还更正了文档,以注意写入 stdout/stderr 不会更改附加到 Stackdriver Logging 中的日志的严重性级别。部署的日志不会附加严重性。
如果您也可以在公共问题跟踪器上发表评论并对主题进行评分以增加其相关性,那就太好了。
归档时间: |
|
查看次数: |
4094 次 |
最近记录: |