"gcloud app logs tail"显示周老数据

Kev*_*rke 9 google-cloud-platform

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

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

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

Jof*_*fre 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'
Run Code Online (Sandbox Code Playgroud)

您应该添加该--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) }"'
Run Code Online (Sandbox Code Playgroud)

作为一个快速测试,我通过管道传输响应以jq格式化输出并将响应大小限制为屏幕大小,但您应该根据字段和输出进行调整,以便更轻松地阅读。