【问题标题】:Query GCP logger for distinct logs based on a field根据字段查询 GCP 记录器以获取不同的日志
【发布时间】:2022-02-02 16:52:49
【问题描述】:

这是我在 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 个不同的日志。

【问题讨论】:

    标签: logging google-cloud-platform


    【解决方案1】:

    有趣的问题。

    Google 的Logging query language 是一种过滤机制。应用过滤器会减少返回的条目数,但不允许对结果进行格式化以转换条目。

    要转换结果you're gonna to need a bigger boat...我建议你考虑使用谷歌的Cloud SDK command-line tools aka gcloud

    使用它,您可以使用您使用日志查看器开发的查询过滤日志:

    gcloud logging read "${FILTER}" \
    --project=${PROJECT}
    

    并且(!)你可以transform (--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
    

    注意 gcloud logging read "${FILTER}" 将过滤器提交到平台并在“服务端”运行。结果(可能很大)然后是例如--formatted 客户端,这可能会耗费时间/处理器。在上面的示例中,为了保存从服务器重复检索数据然后通过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"
        }
      }
    ]
    

    【讨论】:

      猜你喜欢
      • 2020-12-21
      • 2021-03-25
      • 1970-01-01
      • 1970-01-01
      • 2021-10-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-12-04
      相关资源
      最近更新 更多