" gcloud app记录尾巴"显示周老数据

时间:2017-04-18 16:43:54

标签: google-cloud-platform

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

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

有没有办法获得新日志消息的接近实时(几分钟或几小时)视图?

1 个答案:

答案 0 :(得分:0)

对于健康检查,您不需要依赖grep。 SDK有included filters,因此您只需过滤输出即可。但是,您只是将它们隐藏在终端上,但SDK仍会从API中获取它们(就像使用grep一样)。更优化的方法是使用gcloud logging read 'resource.type="gae_app" AND logName:"logs/appengine.googleapis.com%2Frequest_log" AND protoPayload.resource!="/health"' --order desc,因为您只需要请求与自定义过滤器匹配的日志。这会给出相当详细的日志,因此您可以format the output directly on the 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-http并将SDK完成的请求与API上提供的过滤器进行比较,您就会明白为什么它会开始显示一周的日志。

我认为您的最佳选择是直接调用API,包含在watch中。

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

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

然后检查您感兴趣的字段。对于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管理响应以格式化输出并将响应大小限制为屏幕大小,但您应该将其调整为字段和输出,以便更容易给你看。