本文旨在帮助熟悉 Splunk 的用户学习 Kusto 查询语言,以便使用 Kusto 编写日志查询。 本文对二者进行了直接比较,以便强调它们的主要差异和相似之处,从而方便你在现有知识的基础上进行积累。
结构和概念
下表比较了 Splunk 和 Kusto 日志的概念与数据结构:
| 概念 | Splunk | Kusto | 评论 |
|---|---|---|---|
| 部署单元 | cluster | cluster | Kusto 允许跨群集进行任意查询, Splunk 不允许。 |
| 数据缓存 | 存储桶 | 缓存和保留策略 | 控制数据的保留期和缓存级别。 此设置直接影响查询性能和部署成本。 |
| 数据的逻辑分区 | 索引 | database | 允许数据的逻辑隔离。 这两个实现都允许跨这些分区的联合与联接。 |
| 结构化事件元数据 | 空值 | 表 | Splunk 没有将事件元数据的概念公开给搜索语言。 Kusto 日志有表的概念,表包含列。 每个事件实例映射到行。 |
| record | event | 行 | 仅限术语变化。 |
| record 属性 | field | 列 | 在 Kusto 中,此设置预定义为表结构的一部分。 在 Splunk 中,每个事件有自身的字段集。 |
| types | 数据类型 | 数据类型 | Kusto 数据类型更明确,因为它们是在列中设置的。 两者都能动态处理数据类型,并且两者的数据类型集(包括 JSON 支持)大致相同。 |
| 查询和搜索 | 搜索 | query | 概念在 Kusto 和 Splunk 之间在本质上相同。 |
| 事件引入时间 | 系统时间 | ingestion_time() |
在 Splunk 中,每个事件都会获取编制事件索引时的系统时间戳。 在 Kusto 中,可以定义名为 ingestion_time 的策略,用于公开可通过 ingestion_time() 函数引用的系统列。 |
函数
下表指定了 Kusto 中等效于 Splunk 函数的函数。
| Splunk | Kusto | 评论 |
|---|---|---|
strcat |
strcat() |
(1) |
split |
split() |
(1) |
if |
iff() |
(1) |
tonumber |
todouble()tolong()toint() |
(1) |
upperlower |
toupper()tolower() |
(1) |
replace |
replace_string()、replace_strings() 或 replace_regex() |
(1) 尽管这两个产品中的 replace 函数采用三个参数,但这些参数是不同的。 |
substr |
substring() |
(1) 另请注意,Splunk 使用从 1 开始的索引。 Kusto 记录从 0 开始的索引。 |
tolower |
tolower() |
(1) |
toupper |
toupper() |
(1) |
match |
matches regex |
(2) |
regex |
matches regex |
在 Splunk 中,regex 是运算符。 在 Kusto 中,它是关系运算符。 |
searchmatch |
== | 在 Splunk 中,searchmatch 允许搜索确切的字符串。 |
random |
rand() rand(n) |
Splunk 的函数会返回 0 到 231-1 之间的数字。 Kusto 的函数会返回 0.0 到 1.0 之间的数字;如果提供了参数,则会返回 0 到 n-1 之间的数字。 |
now |
now() |
(1) |
relative_time |
totimespan() |
(1) 在 Kusto 中,Splunk 的 relative_time(datetimeVal, offsetVal) 等效项为 datetimeVal + totimespan(offsetVal)。例如, search | eval n=relative_time(now(), "-1d@d") 变成了 ... | extend myTime = now() - totimespan("1d")。 |
(1) 在 Splunk 中,使用 eval 运算符调用该函数。 在 Kusto 中,它用作 extend 或 project 的一部分。
(2) 在 Splunk 中,使用 eval 运算符调用该函数。 在 Kusto 中,该函数可以与 where 运算符配合使用。
运算符
以下部分通过示例演示如何在 Splunk 和 Kusto 中使用不同的运算符。
注意
在以下示例中,Splunk 字段 rule 映射到 Kusto 中的某个表,Splunk 的默认时间戳映射到 Logs Analytics 的 ingestion_time() 列。
搜索
在 Splunk 中,可以省略 search 关键字,并指定不带引号的字符串。 在 Kusto 中,每个查询必须以 find 开头,不带引号的字符串是列名,查找值必须是带引号的字符串。
| 产品 | 运算符 | 示例 |
|---|---|---|
| Splunk | search |
search Session.Id="c8894ffd-e684-43c9-9125-42adc25cd3fc" earliest=-24h |
| Kusto | find |
find Session.Id=="c8894ffd-e684-43c9-9125-42adc25cd3fc" and ingestion_time()> ago(24h) |
筛选器
Kusto 日志查询从应用了 filter 的表格结果集开始。 在 Splunk 中,筛选是针对当前索引执行的默认操作。 你还可以在 Splunk 中使用 where 运算符,但我们不建议那样做。
| 产品 | 运算符 | 示例 |
|---|---|---|
| Splunk | search |
Event.Rule="330009.2" Session.Id="c8894ffd-e684-43c9-9125-42adc25cd3fc" _indextime>-24h |
| Kusto | where |
Office_Hub_OHubBGTaskError| where Session_Id == "c8894ffd-e684-43c9-9125-42adc25cd3fc" and ingestion_time() > ago(24h) |
获取要检查的 n 个事件或行
Kusto 日志查询还支持将 take 用作 limit 的别名。 在 Splunk 中,如果结果已排序,则 head 会返回前 n 个结果。 在 Kusto 中,limit 不会排序,而是返回找到的前 n 行。
| 产品 | 运算符 | 示例 |
|---|---|---|
| Splunk | head |
Event.Rule=330009.2| head 100 |
| Kusto | limit |
Office_Hub_OHubBGTaskError| limit 100 |
获取按字段或列排序的前 n 个事件或行
对于底部结果,在 Splunk 中可以使用 tail。 在 Kusto 中,可以使用 asc 指定排序方向。
| 产品 | 运算符 | 示例 |
|---|---|---|
| Splunk | head |
Event.Rule="330009.2"| sort Event.Sequence| head 20 |
| Kusto | top |
Office_Hub_OHubBGTaskError| top 20 by Event_Sequence |
使用新字段或列扩展结果集
Splunk 有一个 eval 函数,但该函数不可与 Kusto 中的 eval 运算符相比。 Splunk 中的 eval 运算符与 Kusto 中的 extend 运算符均仅支持标量函数和算术运算符。
| 产品 | 运算符 | 示例 |
|---|---|---|
| Splunk | eval |
Event.Rule=330009.2| eval state= if(Data.Exception = "0", "success", "error") |
| Kusto | extend |
Office_Hub_OHubBGTaskError| extend state = iff(Data_Exception == 0,"success" ,"error") |
重命名
Kusto 使用 project-rename 运算符来重命名字段。 在 project-rename 运算符中,查询可以利用为字段预先生成的任何索引。 Splunk 提供的 rename 运算符也有相同的作用。
| 产品 | 运算符 | 示例 |
|---|---|---|
| Splunk | rename |
Event.Rule=330009.2| rename Date.Exception as execption |
| Kusto | project-rename |
Office_Hub_OHubBGTaskError| project-rename exception = Date_Exception |
设置结果和投影的格式
Splunk 使用 table 命令选择要包含在结果中的列。 Kusto 提供的 project 运算符也有相同的作用,甚至更多。
| 产品 | 运算符 | 示例 |
|---|---|---|
| Splunk | table |
Event.Rule=330009.2| table rule, state |
| Kusto | project |
Office_Hub_OHubBGTaskError| project exception, state |
Splunk 使用 fields - 命令选择要从结果中排除的列。 Kusto 提供的 project-away 运算符也有相同的作用。
| 产品 | 运算符 | 示例 |
|---|---|---|
| Splunk | fields - |
Event.Rule=330009.2| fields - quota, hightest_seller |
| Kusto | project-away |
Office_Hub_OHubBGTaskError| project-away exception, state |
聚合
请参阅可用的 summarize 聚合函数的列表。
| Splunk 运算符 | Splunk 示例 | Kusto 运算符 | Kusto 示例 |
|---|---|---|---|
stats |
search (Rule=120502.*)| stats count by OSEnv, Audience |
summarize |
Office_Hub_OHubBGTaskError| summarize count() by App_Platform, Release_Audience |
evenstats |
... | stats count_i by time, category | eventstats sum(count_i) AS count_total by _time_ |
join |
T2 | join kind=inner (T1) on _time | project _time, category, count_i, count_total |
联接
Splunk 中的 join 具有实质性的限制。 子查询限制为 10,000 条结果(在部署配置文件中设置),联接风格数目也有限制。
| 产品 | 运算符 | 示例 |
|---|---|---|
| Splunk | join |
Event.Rule=120103* | stats by Client.Id, Data.Alias | join Client.Id max=0 [search earliest=-24h Event.Rule="150310.0" Data.Hresult=-2147221040] |
| Kusto | join |
cluster("OAriaPPT").database("Office PowerPoint").Office_PowerPoint_PPT_Exceptions| where Data_Hresult== -2147221040| join kind = inner (Office_System_SystemHealthMetadata| summarize by Client_Id, Data_Alias)on Client_Id |
Sort
默认排序顺序为升序。 若要指定降序,请在字段名称前添加减号 (-)。 Kusto 还支持定义 null 值的放置位置:开头或末尾。
| 产品 | 运算符 | 示例 |
|---|---|---|
| Splunk | sort |
Event.Rule=120103| sort -Data.Hresult |
| Kusto | order by |
Office_Hub_OHubBGTaskError| order by Data_Hresult, desc |
多值扩展
多值扩展运算符在 Splunk 和 Kusto 中类似。
| 产品 | 运算符 | 示例 |
|---|---|---|
| Splunk | mvexpand |
mvexpand solutions |
| Kusto | mv-expand |
mv-expand solutions |
结果 facet、相关字段
在 Azure 门户的 Log Analytics 中,仅公开第一列。 可通过 API 查看所有列。
| 产品 | 运算符 | 示例 |
|---|---|---|
| Splunk | fields |
Event.Rule=330009.2| fields App.Version, App.Platform |
| Kusto | facets |
Office_Excel_BI_PivotTableCreate| facet by App_Branch, App_Version |
删除重复数据
在 Kusto 中,可以使用 summarize arg_min() 来反转记录的选择顺序。
| 产品 | 运算符 | 示例 |
|---|---|---|
| Splunk | dedup |
Event.Rule=330009.2| dedup device_id sortby -batterylife |
| Kusto | summarize arg_max() |
Office_Excel_BI_PivotTableCreate| summarize arg_max(batterylife, *) by device_id |
相关内容
- 演练 Kusto 查询语言教程。