OpenSearch SQL 语言 - Amazon CloudWatch 日志
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

OpenSearch SQL 语言

本节包含使用 OpenSearch SQL 查询 CloudWatch 日志的基本介绍。如果你习惯使用关系数据库,它提供了一个熟悉的选项。 OpenSearch SQL 提供了 SQL 功能的子集,使其成为执行临时查询和数据分析任务的理想选择。在 S OpenSearch QL 中,您可以使用诸如 SELECT、FROM、WHERE、GROUP BY、HAVING 等命令和各种其他 SQL 命令和函数。您可以 JOINs 跨日志组执行,使用子查询关联日志组中的数据,并使用丰富的 JSON、数学、字符串、条件和其他 SQL 函数集对日志和安全数据进行强有力的分析。

您只能 OpenSearch 将 SQL 用于查询标准日志类中的日志组。

下表列出了 CloudWatch 日志中支持的 SQL 命令和函数。有关包括语法在内的所有 OpenSearch SQL 命令的信息,请参阅《 OpenSearch 服务开发人员指南》中支持的 SQL 命令

支持的 SQL 命令

命令或功能 示例查询 描述

SELECT

SELECT `@message`, Operation FROM `LogGroupA`

显示预测值。

FROM

SELECT `@message`, Operation FROM `LogGroupA`

内置子句,用于指定要从中检索数据的源表或视图,支持各种类型的联接和子查询。

WHERE

SELECT * FROM `LogGroupA` WHERE Operation = 'x'

根据提供的字段条件筛选日志事件。

GROUP BY

SELECT `@logStream`, COUNT(*) as log_count FROM `LogGroupA` GROUP BY `@logStream`

根据类别对记录事件进行分组,并根据统计数据查找平均值。

HAVING

SELECT `@logStream`, COUNT(*) as log_count FROM `LogGroupA` GROUP BY `@logStream` HAVING log_count > 100

根据分组条件筛选结果。

ORDER BY

SELECT * FROM `LogGroupA` ORDER BY `@timestamp` DESC

根据 ORDER BY 子句中的字段对结果进行排序。您可以按降序或升序排序。

JOIN

SELECT A.`@message`, B.`@timestamp`FROM `LogGroupA` as A INNER JOIN `LogGroupB` as B ON A.`requestId` = B.`requestId`

根据常用字段连接两个表的结果。必须指定 “内连接” 或 “左外连接”

LIMIT

Select * from `LogGroupA` limit 10

将显示的查询结果限制在前 N 行。

字符串函数

SELECT upper(Operation) , lower(Operation), Operation FROM `LogGroupA`

SQL 中的内置函数,可以在 SQL 查询中操作和转换字符串和文本数据。例如,转换大小写、合并字符串、提取部分和清理文本。

日期函数

SELECT current_date() as today, date_add(current_date(), 30) as thirty_days_later, last_day(current_date()) as month_end FROM `LogGroupA`

用于在 SQL 查询中处理和转换日期和时间戳数据的内置函数。例如,date_add、date_format、datediff 和当前日期。

条件函数

SELECT Operation, IF(Error > 0, 'High', 'Low') as error_category FROM `LogGroupA`;

基于指定条件执行操作或有条件地评估表达式的内置函数。例如,大小写和如果。

聚合函数

SELECT AVG(bytes) as bytesWritten FROM `LogGroupA`

内置函数,可对多行执行计算以生成单个汇总值。例如,总和、计数、平均值、最大值和最小值。

JSON 函数

SELECT get_json_object(json_column, '$.name') as name FROM `LogGroupA`

内置函数,用于在 SQL 查询中解析、提取、修改和查询 JSON 格式的数据(例如,from_json、to_json、get_json_object、json_tuple),允许操作数据集中的 JSON 结构。

数组函数

SELECT scores, size(scores) as length, array_contains(scores, 90) as has_90 FROM `LogGroupA`;

用于在 SQL 查询中处理数组类型列的内置函数,允许诸如访问、修改和分析数组数据(例如,大小、爆炸、array_contains)之类的操作。

窗口函数

SELECT field1, field2, RANK() OVER (ORDER BY field2 DESC) as field2Rank FROM `LogGroupA`;

内置函数,可对与当前行(窗口)相关的一组指定行进行计算,从而实现排名、运行总数和移动平均值等操作。例如,ROW_NUMBER、RANK、LAG 和 LEAD

转换函数

SELECT CAST('123' AS INT) as converted_number, CAST(123 AS STRING) as converted_string FROM `LogGroupA`

内置函数,用于在 SQL 查询中将数据从一种类型转换为另一种类型,从而实现数据类型转换和格式转换。例如,CAST、TO_DATE、TO_TIMESTAMP 和 BINARY。

谓词函数

SELECT scores, size(scores) as length, array_contains(scores, 90) as has_90 FROM `LogGroupA`;

基于指定条件或模式评估条件并返回布尔值(真/假)的内置函数。例如,IN、LIKE、BETWEEN、为空和存在。

选择多个日志组

SELECT lg1.field1, lg1.field2 from `logGroups( logGroupIdentifier: ['LogGroup1', 'LogGroup2'])` as lg1 where lg1.field3= "Success"

允许您在 SELECT 语句中指定多个日志组

支持用于 multi-log-group查询的 SQL

要支持在 SQL 中查询多个日志组的用例,可以使用logGroups命令。使用此语法,您可以通过在 FROM 命令中指定多个日志组来查询它们。

语法:

`logGroups( logGroupIdentifier: ['LogGroup1','LogGroup2', ...'LogGroupn'] )

在此语法中,您最多可以在logGroupIdentifier参数中指定 50 个日志组。要引用监控账户中的日志组,请使用 ARNs 而不是LogGroup名称。

示例查询:

SELECT LG1.Column1, LG1.Column2 from `logGroups( logGroupIdentifier: ['LogGroup1', 'LogGroup2'] )` as LG1 WHERE LG1.Column1 = 'ABC'

查询日志时,不支持在语FROM句后使用以下涉及多个 CloudWatch 日志组的语法。

SELECT Column1, Column2 FROM 'LogGroup1', 'LogGroup2', ...'LogGroupn' WHERE Column1 = 'ABC'

限制

当您使用 OpenSearch SQL 在 Lo CloudWatch gs Insights 中进行查询时,以下限制适用。

  • 在一个 SELECT 语句中只能包含一个 JOIN。

  • 仅支持一个级别的嵌套子查询。

  • 不支持用分号 (;) 分隔的多个语句查询。

  • 不支持包含相同但仅在大小写上不同的字段名称的查询(例如 field1 和 FIELD1)。

    例如,不支持以下查询:

    Select AWSAccountId, AwsAccountId from LogGroup

    但是,由于两个日志组中的字段名 (@logStream) 相同,因此支持以下查询:

    Select a.`@logStream`, b.`@logStream` from Table A INNER Join Table B on a.id = b.id
  • 函数和表达式必须对字段名进行操作,并且是 SELECT 语句的一部分,日志组在 FROM 子句中指定。

    例如,不支持以下查询:

    SELECT cos(10) FROM LogGroup

    支持此查询:

    SELECT cos(field1) FROM LogGroup
  • 使用 SQL 或 PPL 命令时,请将某些字段用反引号括起来,以便成功查询它们。对于带有特殊字符(非字母和非数字)的字段,必须使用反引号。例如,用反引号@messageOperation.Export、和Test::Field括起来。您无需用反引号将纯字母名称的列括起来。

    包含简单字段的查询示例:

    SELECT SessionToken, Operation, StartTime FROM `LogGroup-A` LIMIT 1000;

    附加了反引号的类似查询:

    SELECT `@SessionToken`, `@Operation`, `@StartTime` FROM `LogGroup-A` LIMIT 1000;