11

我正在尝试为我的 Google Cloud Platform 应用程序流式传输日志。我注意到的第一件事是谷歌至少每秒发送大约 10 次健康检查,所以我必须grep -v /health获取任何有用的信息。那是标准吗?

第二件事是它流式传输旧日志。我正在运行gcloud app logs tail -s default并从 4 月 11 日(此时是一周前)开始获取日志。较新的日志(从 4、3 和 2 天前开始)在几个小时内慢慢流入。我刚刚在我的应用程序上点击了刷新(这会触发一条日志消息)并且没有看到新的日志。

有什么方法可以获得新日志消息的近实时(几分钟或几小时内)视图?

4

1 回答 1

1

对于运行状况检查,您无需依赖grep. SDK包含过滤器,因此您可以过滤输出。但是,您只是将它们隐藏在终端上,但 SDK 仍会从 API 中获取它们(就像使用 一样grep)。一种更优化的方法是使用gcloud logging read 'resource.type="gae_app" AND logName:"logs/appengine.googleapis.com%2Frequest_log" AND protoPayload.resource!="/health"' --order desc,因为您将只请求与自定义过滤器匹配的日志。这提供了相当详细的日志,因此您可以直接在 SDK 上格式化输出,使其与gcloud app logs tail您想要的相似。

由于gcloud logging没有“尾巴”模式,你可以把它包装成watch这样:

watch 'gcloud logging read "resource.type=\"gae_app\" AND logName:\"logs/appengine.googleapis.com%2Frequest_log\" AND protoPayload.resource!=\"/health\"" --order desc --limit 1'

您应该添加--format标志以使输出满足您的需求,并将--limit标志添加到对您有意义的东西(限制越大,响应越慢)。

关于日志开始的时间,如果您运行gcloud app logs tail -s default --log-httpSDK 完成的请求并将其与 API 上可用的过滤器进行比较,您会看到为什么它开始显示一周前的日志。

我认为在您的情况下,最好的选择是直接调用 API,用watch.

直接 API 调用还允许您添加自定义过滤器并使用字段掩码,仅返回相关的日志条目和字段,从而减少对网络的压力并获得更快的响应。

首先你必须创建一个日志过滤器,它只返回你想要的日志(没有健康检查或监控垃圾邮件)。最好的方法是在控制台本身中进行测试,直到您对显示的日志感到满意为止。

然后检查您感兴趣的字段。对于 GAE 日志,很可能您只需要 protoPayload(并且只需要有效负载的某些字段,但可以稍后过滤这些字段)。

所以我们用下面的方式构建我们的 API 调用循环(警告:引用转义地狱):

watch -tcn 0.5 'curl  -H"Authorization: Bearer $(gcloud auth print-access-token)" \
   -H"Content-Type: application/json" \
   "https://logging.googleapis.com/v2/entries:list?fields=entries%2FprotoPayload" \
   -d"{
   \"filter\":\"resource.type=\\\"gae_app\\\"
                logName=\\\"projects/$(gcloud config get-value project)/logs/appengine.googleapis.com%2Frequest_log\\\"\",
   \"pageSize\":$(tput lines),
   \"orderBy\":\"timestamp desc\",
   \"resourceNames\": [
      \"projects/$(gcloud config get-value project)\"
   ]
 }" 2>\dev\null |jq -cC ".entries[].protoPayload | { timestamp: .startTime, method, status, latency, URL: (.host + .resource) }"'

作为一个快速测试,我将响应通过管道jq传输以格式化输出并将响应大小限制为屏幕大小,但您应该将其调整为更易于阅读的字段和输出。

于 2018-02-24T17:43:24.067 回答