我正在尝试为我的Google Cloud Platform应用程序传输日志。我注意到的第一件事是Google至少每秒发送大约10次健康检查,所以我必须grep -v /health
才能获得任何有用的信息。那是标准吗?
第二件事是它传输旧日志。我正在运行gcloud app logs tail -s default
并从4月11日(此时为一周)获取日志。较新的日志(从4天,3天和2天前)会在几个小时内慢慢流入。我只是在我的应用程序上点击刷新(触发日志消息)并且没有看到新的日志。
有没有办法获得新日志消息的接近实时(几分钟或几小时)视图?
答案 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
管理响应以格式化输出并将响应大小限制为屏幕大小,但您应该将其调整为字段和输出,以便更容易给你看。