Splunk - 在用户打开任何会话时删除第一次登录和最后一次注销之间的事件,其中登录和注销可以连续多次发生?
Splunk - Remove events between 1st login and last logout while user has any session open where logins and logouts can happen multiple times in a row?
这些问题听起来有点令人困惑,所以为了分解它,我试图找到登录和注销之间的时间差。捕获是双重的。时间范围可能没有捕捉到在该时间范围内注销的第一次登录,反之亦然,时间范围可能没有捕捉到在该时间范围内登录的最后一次注销。结果 table.
最终可能如下所示
| Action | Action Number |
|--------|---------------|
| Login | 1 |- 1am
| Login | 2 |- 1:01 am
| Logout | 1 |- 1:02 am
| Logout | 2 |- 1:03 am
| Logout | 3 |- 1:04 am
| Logout | 4 |- 1:05 am
| Login | 3 |- 1:10 am
| Logout | 5 |- 1:11 am
| Login | 4 |- 1:15 am
| Login | 5 |- 1:16 am
| Logout | 6 |- 1:17 am
| Login | 6 |- 1:18 am
| Logout | 7 |- 1:20 am
| Logout | 8 |- 1:22 am
其中操作编号是 login/logout 在时间范围内的编号。例如,第一次登录的操作编号为 1,第一次注销也是如此,依此类推。
我已经编写了逻辑来实现它,但我需要帮助的是 "removing" activity 中每次中断的第一次登录和最后一次注销之间的事件(句点当用户没有登录会话时)。
这意味着该用户的第一次登录(在时间范围内)将是登录 - 1,并且他们有一个登录会话,直到注销 4。这意味着我想删除登录 2 和注销 1和 2. 然后我可以计算两个剩余事件之间的时间差,以找出他们在该时间段内登录到任何会话的总时间。
总而言之,以下是我想从上面生成的结果 table,但我找不到好的方法。
| Action | Action Number | Flag for Deletion |
|--------|---------------|-------------------|
| Login | 1 | False |
| Login | 2 | True |
| Logout | 1 | True |
| Logout | 2 | True |
| Logout | 3 | True |
| Logout | 4 | False |
| Login | 3 | False |
| Logout | 5 | False |
| Login | 4 | False |
| Login | 5 | True |
| Logout | 6 | True |
| Login | 6 | True |
| Logout | 7 | True |
| Logout | 8 | False |
以下 6 行 SPL 生成您的原始数据集:
| makeresults count=1
| eval data="Login,1|Login,2|Logout,1|Logout,2|Logout,3|Logout,4|Login,3|Logout,5|Login,4|Login,5|Logout,6|Login,6|Logout,7|Logout,8"
| makemv delim="|" data
| mvexpand data
| rex field=data "(?<action>[^\,]+),(?<action_number>\d+)"
| fields - _time, data
以下 SPL 以此为基础,以产生所需的结果。笼统地说,它:
- 保持活动会话的计数(streamstats)
- 确保这不会低于零(streamstats,eval)
- 制定下一个操作(反向、streamstats)
- 使用基于会话计数、当前操作和下一步操作的逻辑来决定您是否需要在计算中使用此事件 (eval)
| eval actiontype=if(action=="Login",1,-1)
| streamstats reset_after="("session_count<\"0\"")" sum(actiontype) AS session_count
| eval session_count=if(session_count==-1,0,session_count)
| reverse
| streamstats current=f global=f window=1 max(actiontype) AS next_actiontype
| eval "Flag for Deletion"=if(session_count>1 OR (session_count==0 AND next_actiontype==-1) OR (session_count==1 AND actiontype==-1),"True","False")
| reverse
| fields action, action_number,"Flag for Deletion"
这些问题听起来有点令人困惑,所以为了分解它,我试图找到登录和注销之间的时间差。捕获是双重的。时间范围可能没有捕捉到在该时间范围内注销的第一次登录,反之亦然,时间范围可能没有捕捉到在该时间范围内登录的最后一次注销。结果 table.
最终可能如下所示| Action | Action Number |
|--------|---------------|
| Login | 1 |- 1am
| Login | 2 |- 1:01 am
| Logout | 1 |- 1:02 am
| Logout | 2 |- 1:03 am
| Logout | 3 |- 1:04 am
| Logout | 4 |- 1:05 am
| Login | 3 |- 1:10 am
| Logout | 5 |- 1:11 am
| Login | 4 |- 1:15 am
| Login | 5 |- 1:16 am
| Logout | 6 |- 1:17 am
| Login | 6 |- 1:18 am
| Logout | 7 |- 1:20 am
| Logout | 8 |- 1:22 am
其中操作编号是 login/logout 在时间范围内的编号。例如,第一次登录的操作编号为 1,第一次注销也是如此,依此类推。
我已经编写了逻辑来实现它,但我需要帮助的是 "removing" activity 中每次中断的第一次登录和最后一次注销之间的事件(句点当用户没有登录会话时)。
这意味着该用户的第一次登录(在时间范围内)将是登录 - 1,并且他们有一个登录会话,直到注销 4。这意味着我想删除登录 2 和注销 1和 2. 然后我可以计算两个剩余事件之间的时间差,以找出他们在该时间段内登录到任何会话的总时间。
总而言之,以下是我想从上面生成的结果 table,但我找不到好的方法。
| Action | Action Number | Flag for Deletion |
|--------|---------------|-------------------|
| Login | 1 | False |
| Login | 2 | True |
| Logout | 1 | True |
| Logout | 2 | True |
| Logout | 3 | True |
| Logout | 4 | False |
| Login | 3 | False |
| Logout | 5 | False |
| Login | 4 | False |
| Login | 5 | True |
| Logout | 6 | True |
| Login | 6 | True |
| Logout | 7 | True |
| Logout | 8 | False |
以下 6 行 SPL 生成您的原始数据集:
| makeresults count=1
| eval data="Login,1|Login,2|Logout,1|Logout,2|Logout,3|Logout,4|Login,3|Logout,5|Login,4|Login,5|Logout,6|Login,6|Logout,7|Logout,8"
| makemv delim="|" data
| mvexpand data
| rex field=data "(?<action>[^\,]+),(?<action_number>\d+)"
| fields - _time, data
以下 SPL 以此为基础,以产生所需的结果。笼统地说,它:
- 保持活动会话的计数(streamstats)
- 确保这不会低于零(streamstats,eval)
- 制定下一个操作(反向、streamstats)
- 使用基于会话计数、当前操作和下一步操作的逻辑来决定您是否需要在计算中使用此事件 (eval)
| eval actiontype=if(action=="Login",1,-1)
| streamstats reset_after="("session_count<\"0\"")" sum(actiontype) AS session_count
| eval session_count=if(session_count==-1,0,session_count)
| reverse
| streamstats current=f global=f window=1 max(actiontype) AS next_actiontype
| eval "Flag for Deletion"=if(session_count>1 OR (session_count==0 AND next_actiontype==-1) OR (session_count==1 AND actiontype==-1),"True","False")
| reverse
| fields action, action_number,"Flag for Deletion"