这是我在gcp记录器中的项目中的一个示例日志
{
"insertId": "________",
"jsonPayload": {
"stacktrace": "github.com_____",
"level": "error",
"msg": "could not update usage",
"caller": "pkg/_______.go:118",
"ts": ______.______,
"requestID": "c7taeaa23akg00e8r0tg",
"error": "write exception: write errors: [The field 'fieldName' must be an array but is of type null in document {_id: ObjectId('objectID001')}]"
},
"resource": {
"type": "cloud_run_revision",
"labels": {
"configuration_name": "configName",
"service_name": "serviceName",
"location": "us-central1",
"project_id": "projectID",
"revision_name": "revisionName"
}
},
"timestamp": "2022-02-02T15:45:45.867386Z",
"labels": {
"instanceId": "____________"
},
"logName": "projects/_____/logs/run.googleapis.com%2Fstderr",
"receiveTimestamp": "2022-02-02T15:45:45.967298989Z"
}
问题是有太多的日志都有这个确切的内容。我的问题是,是否存在可用于检索具有相同jsonPayload.error
的一个日志的查询或一组查询。
例如,如果有6个日志,其中3个具有相同的jsonPayload.error
,我需要实现的是获得4个日志,在这些日志中,重复的日志将被取消,并且其中只有一个日志将与其他3个不同的日志一起在输出端。
有趣的问题。
谷歌的日志查询语言是一种过滤机制。应用筛选器可以减少返回的条目数量,但不允许格式化结果以转换条目。
为了改变结果,你需要一艘更大的船。。。我建议您考虑使用Google的Cloud SDK命令行工具,也就是gcloud
。
使用此功能,您可以使用日志查看器开发的查询过滤日志:
gcloud logging read "${FILTER}"
--project=${PROJECT}
和(!(你可以变换(--format
(的结果:
gcloud logging read "${FILTER}"
--format="${FORMAT}"
--project=${PROJECT}"
注意
gcloud
的格式似乎不包括唯一|不同的功能,因此我们将使用标准的linux(sort
|uniq
(命令来实现这一点。
例如,cloud.audit.logging
操作的一个有望通用的查询:
PROJECT="..." # Your Project ID
# You would use "logName="projects/${PROJECT}/logs/run.googleapis.com%2Fstderr""
FILTER="logName="projects/${PROJECT}/logs/cloudaudit.googleapis.com%2Factivity""
# You would use "value(jsonPayload.error)"
FORMAT="value(operation.producer)"
gcloud logging read "${FILTER}"
--project=${PROJECT}
--format="${FORMAT}"
--limit=50
> test.log
cat test.log | sort | uniq
收益率:
cloudfunctions.googleapis.com
compute.googleapis.com
container.googleapis.com
k8s.io
servicemanagement.googleapis.com
serviceusage.googleapis.com
NOTE
gcloud logging read "${FILTER}"
向平台提交过滤器并运行";"服务侧";。结果(可能很大(然后被例如--format
’ted客户端,并且这可能耗费时间/处理器。在上面的示例中,为了避免重复从服务器检索数据,然后通过sort
和uniq
进行管道传输,首先将日志转储到文件中会更高效。我还使用了--limit
来人为地限制为测试目的返回的结果数量。您可能需要使用时间过滤器或其他约束条件。
因为您引用了jsonPayload
,所以您也可以使用gcloud ... --format=json(...)
来提取JSON格式的日志。如上所述,gcloud
包括格式化功能,但也如上所示,有时使用通用工具最容易。在这种情况下,jq
提供了转换JSON的强大方法。
gcloud logging read "${FILTER}"
--project=${PROJECT}
--format="${FORMAT}"
--limit=50
> test.json
cat test.json | jq -r unique
收益率:
[
null,
{
"operation": {
"producer": "cloudfunctions.googleapis.com"
}
},
{
"operation": {
"producer": "compute.googleapis.com"
}
},
{
"operation": {
"producer": "container.googleapis.com"
}
},
{
"operation": {
"producer": "k8s.io"
}
},
{
"operation": {
"producer": "servicemanagement.googleapis.com"
}
},
{
"operation": {
"producer": "serviceusage.googleapis.com"
}
}
]