You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

求助:如何从CSV文件的time列计算VPN客户端会话时长?

计算VPN客户端会话时长的PowerShell方案

核心思路

你的CSV日志包含time(事件时间)、user(用户名)、msg(事件描述)字段,要计算会话时长,需先按用户分组,匹配对应登录事件和登出事件,再将时间字符串转为可计算的DateTime类型,最终算出时间差。

实现代码

假设日志中登录事件的msg包含Login succeeded,登出事件包含Session terminated(可根据实际日志内容调整关键词):

# 读取转换后的CSV文件
$csvData = Import-Csv -Path "F:\myfile.csv"

# 转换time列为DateTime类型,按用户分组
$groupedUsers = $csvData | ForEach-Object {
    # 根据你的日志时间格式解析,示例格式为yyyy-MM-dd HH:mm:ss,需按需调整
    $_.time = [DateTime]::ParseExact($_.time, "yyyy-MM-dd HH:mm:ss", $null)
    $_
} | Group-Object -Property user

# 遍历用户组,计算每个会话的时长
$sessionResults = $groupedUsers | ForEach-Object {
    $sortedEvents = $_.Group | Sort-Object time
    $logins = $sortedEvents | Where-Object { $_.msg -match "Login succeeded" }
    $logouts = $sortedEvents | Where-Object { $_.msg -match "Session terminated" }

    # 按时间顺序配对登录/登出事件
    for ($i=0; $i -lt [Math]::Min($logins.Count, $logouts.Count); $i++) {
        $duration = $logouts[$i].time - $logins[$i].time
        [pscustomobject]@{
            User = $_.Name
            ClientIP = $logins[$i].remip
            LoginTime = $logins[$i].time
            LogoutTime = $logouts[$i].time
            SessionDuration = $duration.ToString("hh\:mm\:ss") # 格式化为时分秒
            TotalSeconds = $duration.TotalSeconds # 可选:输出总秒数便于统计
        }
    }
}

# 将结果导出到新CSV
$sessionResults | Export-Csv -Path "F:\VPN_Session_Durations.csv" -NoTypeInformation

关键调整提示

  • 时间格式适配:如果你的time列格式不是yyyy-MM-dd HH:mm:ss,修改ParseExact的第二个参数,比如MM/dd/yyyy HH:mm:ss或yyyy-MM-ddTHH:mm:ss。
  • 事件关键词匹配:根据实际日志的msg内容调整匹配规则,比如用$_.msg -like "*用户登录*"或$_.msg -eq "Session closed"。
  • 异常会话处理:如果存在未配对的登录/登出(比如异常断开),可添加逻辑标记为「未正常结束会话」。

内容的提问来源于stack exchange,提问作者Sajjad Muslim

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.22 09:48:13