排查 Logging 查询语言问题

本文档介绍了您在使用 Logging 查询语言时可能会遇到的常见问题。

语法问题

如果查询的表达式有问题,请检查以下各项:

  • 您的查询应遵循语法规则,并使用匹配的括号和引号。

  • 您的日志条目字段名称拼写正确。

  • 布尔运算采用大写字母(ANDORNOT)。

  • 确保使用 NULL_VALUE 表示 JSON null 值。

  • 为明确起见,作为全局限制的布尔表达式或作为比较运算右侧的布尔表达式应加英文括号。例如,以下两个查询看起来相同,但实际并不相同:

    insertId = "ABC-1" OR "ABC-2"  -- ERROR!?
    insertId = ("ABC-1" OR "ABC-2")
    
  • 不带英文引号的文本不得包含任何特殊字符。如果不确定,请添加英文双引号。例如,在以下代码中,由于嵌入了子字符串运算符 (:),第一个比较运算不符合规则。比较运算必须用英文引号括起来:

    insertId = abc:def  -- ILLEGAL!
    insertId = "abc:def"
    
  • Google Cloud CLI 要求为查询添加英文双引号。如需使用英文双引号通过 gcloud logging 命令进行转义特殊字符写入,请改用英文单引号将整个查询引起来:

    gcloud logging read 'resource.type=gce_instance AND jsonPayload.message="Stopped Unattended Upgrades Shutdown."'
    gcloud logging read 'timestamp>="2020-06-17T21:00:00Z"'
    

  • 当您按与 Any 消息类型关联的字段进行过滤时,系统会自动遍历 value 字段。因此,请勿在查询中添加 value

    例如,AuditLog 消息中的 Status 字段包含类型为 google.protobuf.Anydetails 字段。如需查询 details 字段,请在指定过滤条件时省略 value 字段:

    • 正确做法

      protoPayload.status.details.conditionNotMet.userVisibleMessage =~ "Specified reservation.*"
      
    • 错误做法

      protoPayload.status.details.value.conditionNotMet.userVisibleMessage =~ "Specified reservation.*"