查询GCP记录器以获取基于字段的不同日志



这是我在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

NOTEgcloud logging read "${FILTER}"向平台提交过滤器并运行";"服务侧";。结果(可能很大(然后被例如--format’ted客户端,并且这可能耗费时间/处理器。在上面的示例中,为了避免重复从服务器检索数据,然后通过sortuniq进行管道传输,首先将日志转储到文件中会更高效。我还使用了--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"
}
}
]

最新更新