Splunk 到 Kusto 备份单

使用 “版本 ”下拉列表切换服务。 了解有关导航的详细信息。
适用于:✅ Azure Data Explorer ✅ Azure Monitor ✅ Microsoft Sentinel

本文旨在帮助熟悉 Splunk 的用户学习 Kusto 查询语言,以便使用 Kusto 编写日志查询。 本文对二者进行了直接比较,以便强调它们的主要差异和相似之处,从而方便你在现有知识的基础上进行积累。

结构和概念

下表比较了 Splunk 和 Kusto 日志的概念与数据结构:

概念 Splunk Kusto 评论
部署单元 群集 群集 Kusto 允许跨群集进行任意查询, Splunk 不允许。
数据缓存 存储桶 缓存和保留策略 控制数据的保留期和缓存级别。 此设置直接影响查询性能和部署成本。
数据的逻辑分区 索引 数据库 允许数据的逻辑隔离。 这两个实现都允许跨这些分区的联合与联接。
结构化事件元数据 空值 表 Splunk 没有将事件元数据的概念公开给搜索语言。 Kusto 日志有表的概念,表包含列。 每个事件实例映射到行。
记录 事件 行 仅限术语变化。
record 属性 字段 列 在 Kusto 中,此设置预定义为表结构的一部分。 在 Splunk 中,每个事件有自身的字段集。
types 数据类型 数据类型 Kusto 数据类型更明确,因为它们是在列中设置的。 两者都能动态处理数据类型,并且两者的数据类型集(包括 JSON 支持)大致相同。
查询和搜索 搜索 查询 概念在 Kusto 和 Splunk 之间在本质上相同。
事件引入时间 系统时间 ingestion_time() 在 Splunk 中,每个事件都会获取编制事件索引时的系统时间戳。 在 Kusto 中,可以定义名为 ingestion_time 的策略,用于公开可通过 ingestion_time() 函数引用的系统列。

Functions

下表指定了 Kusto 中等效于 Splunk 函数的函数。

Splunk Kusto 评论
strcat strcat() (1)
split split() (1)
if iff() (1)
tonumber todouble()
tolong()
toint()
(1)
upper
lower
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 运算符,该运算符执行相同的作,more。

产品 运算符 示例
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 portal 中的 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 和 Splunk 都使用 timechart 运算符来可视化随时间推移的数据。 在 Splunk 中,它会聚合指定时间间隔内的数据,并可用于各种统计函数。 在 Kusto 中,等效项是使用 summarize 和 bin 函数实现的,后跟 呈现时间图 运算符。

产品 运算符 示例
Splunk timechart index=StormEvents
| where StartTime >= "2007-01-01" AND StartTime <= "2007-12-31" AND DamageCrops > 0
| bin span=7d StartTime
| stats count as EventCount by StartTime
| timechart span=7d count as EventCount
Kusto timechart StormEvents
| where StartTime between (datetime(2007-01-01) .. datetime(2007-12-31)) and DamageCrops > 0
| summarize EventCount = count() by bin(StartTime, 7d)
| render timechart