【问题标题】:Logs are Not Nested Under Requests in Flexible VM日志不嵌套在灵活 VM 中的请求下
【发布时间】:2016-08-21 08:24:06
【问题描述】:

我有一个模块在 App Engine Classic 中运行,另一个模块在 App Engine Flexible 中运行。查看 App Engine Classic 中运行的日志时,日志条目嵌套在每个请求中。

但是,当查看在 App Engine Flexible 中运行的日志时,它们不是嵌套的。每个日志条目似乎都与请求无关。这使得很难确定哪个日志与哪个请求相关联。

是否可以让 App Engine Flexible 中的日志嵌套在每个请求下(就像在 App Engine Classic 中一样)?

我在文档中找不到任何解释这种差异的内容。

【问题讨论】:

  • 您使用的是哪个运行时? Java 8、Python 等,还是您使用的是自定义 Docker 映像?
  • 我使用的是自定义运行时(runtime: customvm: true),但我的基础映像是gcr.io/google_appengine/python-compat-multicore,它应该与标准 App Engine API 兼容。

标签: google-app-engine logging google-cloud-logging


【解决方案1】:

正如您可能想象的那样,App Engine Flexible 使用了许多与传统 App Engine 不同的机制,并且这些不同的环境确实以不同的方式记录日志。遗憾的是,目前无法让 Flexible 以与 Classic 相同的数据格式登录。

如果这对您来说足够重要,您可以随时直接通过 Cloud Logging API 进行日志记录,这就是 App Engine 日志记录 API 最终传递到今天的内容。您可以通过查看传统的 App Engine 条目来推断要记录的数据格式,尽管我们已打开功能请求以更明确地公开记录这一点。

另外,顺便提一下,在 Stackdriver Logging(以前的 Cloud Logging)方面,我们肯定在考虑如何更普遍地支持这种日志数据的非规范化,而不仅仅是 App Engine 日志记录的特殊情况以特定格式,因为这将是广泛有用的功能。但是,我们目前没有任何具体的计划或时间表可以分享——只是注意到我们已经注意到了这一点。

【讨论】:

  • 谢谢本。这些非规范化日志是否仅在使用灵活自定义运行时(即runtime: customvm: true)时出现?使用标准灵活运行时(即runtime: python-compatvm: true)时,用户是否会获得嵌套日志?
  • 在不同的运行时加入,runtime: python 我们没有得到嵌套日志。不知道python-compat
  • 嗨,Ben,您是否更新了有关如何使用日志记录 API 模拟应用引擎标准日志分组请求的文档?
  • 自言自语到现在已经快两年了。很想看到这个记录在案的官方文件。
【解决方案2】:

您现在可以按照此处的说明编写与 App Engine Standard 类似的嵌套应用程序日志:https://cloud.google.com/logging/docs/view/service/appengine-logs#linking_application_logs_and_requests

【讨论】:

  • 是的,刚刚注意到这个功能被打开了,很高兴看到它终于出现了。附注:要查看这些日志,您需要在日志查看器的日志类型下拉列表中手动选择 app 日志。
  • 谢谢!此外,当它说“trace 在父级及其子级(ren)中必须相同”时,也意味着“必须设置trace”。
  • 有人可以举例说明如何使用它。例如,柔性环境已经生成“父”日志条目(针对请求本身)。如何获取该父条目的 resource.type、resource.labels 和 trace 的值,以将它们传播到子条目?
【解决方案3】:

Marc Unangst 将应用程序日志和请求链接起来的建议听起来很棒,不幸的是有关如何实现这一点的文档不是很清楚 (https://cloud.google.com/appengine/articles/logging#linking_app_logs_and_requests)。

使用 Google Cloud Client Libraries for Python (https://google-cloud-python.readthedocs.io/en/latest/logging/handlers-app-engine.html) 中的“Google App Engine 灵活日志处理程序”,我已经能够登录到作为应用引擎日志堆栈一部分的“应用”日志灵活的应用程序本身。所以我目前和话题发起者在同一条船上。

我注意到,根据日志链接的要求,resource.labelsresource.type 属性会自动以这种方式正确设置。但是,缺少trace 信息,似乎缺少有关如何包含此信息的说明。

接下来,时间似乎也总是不对。说明要求应用程序日志条目的 timestamp 介于相应 HTTP 请求的 parent.timestamp - parent.httpRequest.latency 之间。我注意到我的应用程序日志条目的时间戳总是稍晚于相应请求的timestamp。这很奇怪,因为这些条目是在 请求期间生成的。

对我来说,目前看起来日志处理程序在写入日志条目时不知道正在进行的 HTTP 请求周期(我在 Django 中使用它),因此缺少trace id?不知道如何从这里继续,喜欢听听其他人可能取得的成就。

【讨论】:

  • 嗨 Raj,欢迎来到 Stack Overflow!我不完全理解您的答案-您是否提供了有关如何解决此问题的其他信息?还是您只是说您遇到了与原始海报相同的问题?
  • 嗨,Max,两种情况都适用。我被困在与原始海报相同的问题上,我想通过提供有关我尝试解决此问题的经验的信息来扩展他的帖子。例如,记录到“应用程序”日志本身需要对使用 StackDriver API 的各种方式进行相当多的搜索。正如其他发帖者所提到和感受到的,日志链接是一个不错的功能,但可以从更好(或更好的可查找性)文档中受益。我考虑将评论提高几级,但受到限制(新帐户)。
【解决方案4】:

我遇到了和你一样的问题。我的应用程序在 Django 框架上运行,因此我创建了中间件来管理日志嵌套并使用“google-cloud-logging”库通过Google Cloud Logging API 开始记录。

Google Cloud Loggin API 文档对此没有很好的文档。

在创建日志时,您需要添加“TRACE”此跟踪应指向其父日志。

我能够实现以下结果:

请查看我关于实施此解决方案的分步博客here

请在 Github 上查看存储库源代码here

【讨论】:

  • 请尽量避免链接将来可能会消失并导致链接断开。
  • 是的,实际上你是对的,从谷歌云文档中推荐解决方案的“已接受答案”链接已过期并指向其他地方。我经历过这个问题,并认为我可以分享我创建的解决方案并在这里快速分享:)。谢谢你的想法:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-12-13
  • 2021-07-17
  • 1970-01-01
  • 2017-04-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多