CloudWatch Logs Insights 查询语法中的display
和指令有什么区别?fields
这些描述来自AWS 文档看起来和我很相似:
display:
指定在查询结果中显示哪些字段。
fields:
从日志事件中检索指定字段以供显示。
举个例子,我在 Cloudwatch 中存储了以下结构的日志(包含以下字段):
@timestamp
@message
stream
(stdout
|stderr
)kubernetes.namespace_name
- ...
以下是令我困惑的有效查询示例:
- 我可以显示任何未检索到的字段:
limit 8
| display @message, stream
- 即使我没有在中指定它,我也可以显示一个字段
fields
。
fields @message, stream
| limit 8
| display @message, stream, kubernetes.namespace_name
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
定义的输出,并且将添加到当前定义的输出。display
fields
fields
例子:
- 返回@timestamp、@message、@logStream、@log 字段
fields @timestamp, @message, @logStream, @log
| sort @timestamp desc
| limit 20
- 返回@message
fields @timestamp, @message, @logStream, @log
| sort @timestamp desc
| limit 20
| display @message
- 返回@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
),或者过滤某些字段以提高速度,但只在最后显示最终结果。