“gcloud app logs tail”显示一周前的数据
Posted
技术标签:
【中文标题】“gcloud app logs tail”显示一周前的数据【英文标题】:"gcloud app logs tail" shows week old data 【发布时间】:2017-09-14 15:01:20 【问题描述】:我正在尝试为我的 Google Cloud Platform 应用程序流式传输日志。我注意到的第一件事是谷歌每秒至少发送大约 10 次健康检查,所以我必须grep -v /health
才能获得任何有用的信息。这是标准吗?
第二件事是它流式传输旧日志。我正在运行 gcloud app logs tail -s default
并从 4 月 11 日(此时一周大)获取日志。较新的日志(从 4、3 和 2 天前开始)在几个小时内慢慢流入。我刚刚在我的应用上点击了刷新(这会触发一条日志消息),但没有看到新的日志。
有什么方法可以接近实时(在几分钟或几小时内)查看新的日志消息?
【问题讨论】:
遇到同样的问题。你有什么发现吗?目前正在尝试清除日志gcloud beta logging logs list
gcloud beta logging logs delete LOG_NAME
这个命令的命名是糟糕的设计 IMO。任何习惯使用 Linux 命令 tail 的人都会期望该行为在日志流入时显示实时的日志馈送。我看到了一个月前的数据!使命令毫无意义 IMO。
【参考方案1】:
对于运行状况检查,您无需依赖 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
传送以格式化输出并将响应大小限制为屏幕大小,但您应该将其调整为使您更容易阅读的字段和输出.
【讨论】:
3 年后,这对我很有帮助。我遇到了gcloud app logs tail -s my-servicename
的问题(服务名称不是“默认”) - 日志根本不会出现,即使它们出现在控制台中,即使 tail 命令有效反对default
。谢谢!以上是关于“gcloud app logs tail”显示一周前的数据的主要内容,如果未能解决你的问题,请参考以下文章