如何将第一个KQL查询结果用于第二个查询的过滤?
KQL中用域名列表过滤查询的实现方法
你不需要在KQL里用循环/迭代来实现这个需求,KQL作为面向集合的查询语言,提供了更高效的集合操作函数来完成这类过滤。你的核心问题是原写法中contains操作符只能接收单个字符串,无法直接处理域名列表,这里可以用contains_any()函数来解决。
修正后的完整查询写法
方式一:直接定义域名列表变量
// 提取符合条件的域名列表并转为字符串数组 let hostnames = AllDomains | where hostname !contains "default.com" and hostname != "" | distinct hostname | summarize make_list(hostname); // 过滤日志事件 let start_date = ago(10m); let end_date = now(); LogEvents | where env_time between (start_date .. end_date) | where headers contains "X-Forwarded-For" | where queryString contains_any (hostnames) // 检查queryString是否包含列表中任意域名 | project queryString
方式二:复用域名查询为函数(适合多次调用场景)
// 定义可复用的域名查询函数 let get_target_hostnames = () { AllDomains | where hostname !contains "default.com" and hostname != "" | distinct hostname | summarize make_list(hostname) }; // 过滤日志事件 let start_date = ago(10m); let end_date = now(); LogEvents | where env_time between (start_date .. end_date) | where headers contains "X-Forwarded-For" | where queryString contains_any (get_target_hostnames()) | project queryString
关键说明
contains_any()是KQL专门用于检查字符串是否包含指定列表中任意元素的函数,比手动循环迭代高效得多- 需要用
summarize make_list(hostname)将去重后的域名转换为字符串数组,作为contains_any()的参数 - 原写法中
queryString contains (hostnames())的错误在于:contains仅支持单个字符串输入,无法直接处理集合/列表
内容的提问来源于stack exchange,提问作者Razi
相关产品推荐
相关产品推荐

