使用Kusto Query Language统计指定日期带时间戳的登录用户数及明细查询
现有查询的核心问题
- 执行
distinct user_AccountId步骤时,系统会仅保留用户账号ID字段,其余字段(包括登录时间戳timestamp)会被全部剔除,后续操作根本无法获取每个用户的登录时间明细。 - 执行完
distinct user_AccountId后,每个用户账号仅对应1行数据,后续的summarize count() by user_AccountId会让每个用户的统计值固定为1,完全失去登录频次统计的意义。 - 原有正则匹配存在语法错误:KQL正则引擎中
*是前置表达式的重复限定符,不能直接放在匹配模式最开头,原写法^*@xxxxx-xxxx.net、^*@xxxxtool完全无法实现预期的域账号过滤效果。 - 现有逻辑没有把“全局登录用户总数”和“逐用户登录明细”整合为可直接输出的结果结构,需要拆分多次查询才能拿到完整数据。
修正后的可落地KQL查询
保留原有的账号过滤、时间范围筛选逻辑,修正语法问题后实现需求:
requests // 二选一设置统计时间范围:可自定义指定时间区间,也可使用近1天的快捷范围 | where timestamp between (datetime(2021-03-01) .. datetime(2021-03-31)) // | where timestamp > ago(1d) // 保留原有服务类/无效账号排除规则 | where user_AccountId !in ("sdasw", "gkhsksaauh", "dadwfa", "FREAD", "ReportBatch", "HSAIIF", "87383123hADHUQ++==", "GHDSQQU**++") // 修正正则语法,过滤两类无效域账号 | where not(user_AccountId matches regex @".+@xxxxx-xxxx\.net$") | where not(user_AccountId matches regex @".+@xxxxtool$") | where user_AccountId != "" // 按用户维度聚合,拿到每个用户的登录时间明细、单用户登录次数 | summarize 登录时间明细列表 = make_list(timestamp), 单用户登录次数 = count() by user_AccountId // 计算全局去重登录用户总数,直接追加到结果中 | extend 统计周期内总登录用户数 = dcount(user_AccountId)
输出字段说明
user_AccountId:符合筛选规则的单个登录用户账号登录时间明细列表:对应用户在统计周期内的所有登录时间戳集合单用户登录次数:对应用户在统计周期内的登录总频次统计周期内总登录用户数:当前筛选条件下的全量去重登录用户总数,所有结果行的该值为统一全局统计值,无需二次计算。
注意:如果需要调整过滤的域账号规则,要保证正则符合KQL语法规范,避免使用带无前置表达式的
*的无效匹配模式。
内容的提问来源于stack exchange,提问作者Z Rahman
相关产品推荐
相关产品推荐

