CloudWatch Logs Insights 查询语法中的 display 和 fields 指令之间的差异

CloudWatch Logs Insights 查询语法中的 display 和 fields 指令之间的差异

CloudWatch Logs Insights 查询语法中的display和指令有什么区别?fields

这些描述来自AWS 文档看起来和我很相似:

display:指定在查询结果中显示哪些字段。

fields:从日志事件中检索指定字段以供显示。

举个例子,我在 Cloudwatch 中存储了以下结构的日志(包含以下字段):

  • @timestamp
  • @message
  • streamstdout| stderr
  • kubernetes.namespace_name
  • ...

以下是令我困惑的有效查询示例:

  1. 我可以显示任何未检索到的字段:
limit 8
| display @message, stream
  1. 即使我没有在中指定它,我也可以显示一个字段fields
fields @message, stream
| limit 8
| display @message, stream, kubernetes.namespace_name
  1. fields我在解析时指定一个字段并不重要:
fields @message
| parse @message "[*] *" as loggingType, loggingMessage
| display loggingMessage
parse @message "[*] *" as loggingType, loggingMessage
| display loggingMessage

该指令的含义是什么fields?直接使用 还不够吗display

答案1

fields和命令之间的区别display在于fields行为是累积的,而显示不是(类似替换的行为)。

来自CloudWatch Logs Insights 查询语法指南

如果您的查询包含多个字段命令并且不包含显示命令,您将显示字段命令中指定的所有字段。

因此,命令将替换任何先前的或命令(或定义临时字段的任何其他命令)display定义的输出,并且将添加到当前定义的输出。displayfieldsfields

例子:

  1. 返回@timestamp、@message、@logStream、@log 字段
fields @timestamp, @message, @logStream, @log
| sort @timestamp desc
| limit 20
  1. 返回@message
fields @timestamp, @message, @logStream, @log
| sort @timestamp desc
| limit 20
| display @message
  1. 返回@message、requestId、text、hasRequestId
fields @timestamp, @message, @logStream, @log
| sort @timestamp desc
| limit 20
| display @message
| parse @message "(*) *" as requestId, text
| fields !isblank("requestId") as hasRequestId

最后一个例子使用命令定义临时字段(这些字段在开始时parse没有)和上一个命令定义的表达式字段@fields

答案2

根据我对文档的阅读,fields它将在查询期间使用,并且display仅在最后展示。display并且只有效一次(使用最后一次调用)。

我的意思是,在这个例子中:

fields concat(Operation, '-', StatusCode) as opStatus

我认为你不能用它display来做同样的事情。

您可能希望收集多个字段来计算一个值(使用fields),或者过滤某些字段以提高速度,但只在最后显示最终结果。

相关内容