Разбор последовательного файла журнала с помощью Powershell - PullRequest
1 голос
/ 07 января 2020

У меня есть файл журнала от Cisco CUBE, который я пытаюсь проанализировать. (См. Пример ниже)

492447672: 23617598: Jan  3 2020 09:35:53.723 CST: //3589443/8FEADF5BB96C/SIP/Msg/ccsipDisplayMsg:
492447674: SIP/2.0 100 Trying
492447676: From: <sip:121212121212@11.22.33.44>;tag=3532003747967211_c1b08.2.4.1565675433978.0_13167287_41590160
492447677: To: <sip:8665095396@32.253.171.2>
492447678: Date: Fri, 03 Jan 2020 09:35:53 GMT
492447679: Call-ID: 6071103241340198@c1b08_2_4
492447732: 
492447785: 23617598: Jan  3 2020 09:35:53.742 CST: //3589444/8F3ADF6BB96C/SIP/Msg/ccsipDisplayMsg:
492447787: SIP/2.0 200 OK
492447789: From: <sip:7274614191@55.66.77.88>;tag=F5F6B278-C41
492447790: To: <sip:3142093827@10.0.9.2>;tag=81980079~12263472-39ad-9427-486e-bf5a8d182fc5-45401032
492447791: Date: Fri, 03 Jan 2020 15:35:53 GMT
492447792: Call-ID: 6071103241340198@c1b08_2_4
492448015: 
492448016: 23617598: Jan  3 2020 09:35:54.621 CST: //-1/xxxxxxxxxxxx/SIP/Msg/ccsipDisplayMsg:
492448018: BYE sip:000003142093802@99.88.77.66:5060;user=phone SIP/2.0
492448020: From: <sip:8007751000@22.33.44.55>;tag=7503241779906852_c2b07.2.1.1565675434828.0_13161968_41570935
492448021: To: <sip:8776030785@33.44.55.66>;tag=F5EC255A-6B1
492448022: Call-ID: 6071103241340198@c1b08_2_4

Идея состоит в том, чтобы идентифицировать вызовы, которые не генерировали статус «ОК». Я использую прилагаемый код для генерации хеш-таблицы всех записей вызовов. Для каждого callID имеется несколько записей. Это решение на самом деле не делает то, что я хочу: я хотел бы найти любые фрагменты журнала, которые не имеют строку " SIP / 2.0 200 OK " между строки " SIP / 2.0 100 Trying " и " BYE sip: " (выдержка ниже делает это) и извлечение CallID , To и С . Как бы я это сделал?

$logPath = "c:\temp\logfile.txt"
$csvPath = $logPath + ".csv"
$myArr = @()
$myArr = [IO.File]::ReadAllText($logPath) | Select-String -Pattern "\d+: \d{8}[\s\S]*?(?=\d+:\s\d{8})|($)" -AllMatches | % { $_.Matches } | % { $_.Value } 
$results = @()
foreach ($item in $myArr) {
    $result = [PSCustomObject]@{
        # CallRef =     Select-String -InputObject $item -Pattern "(?<=\d+: )\d{8}(?=.*\r)" | % {$item.Matches} | % {$item.Value}
        CallID = Select-String -InputObject $item -Pattern "(?<=\d+: Call-ID: ).*?(?=\r)" | % { $_.Matches } | % { $_.Value }
        Date   = Select-String -InputObject $item -Pattern "(?<=\d+: \d{8}: ).*CST(?=:.*\r)" | % { $_.Matches } | % { $_.Value }
        Status = Select-String -InputObject $item -Pattern "(?<=\d+: SIP/2.0 \d+ ).*?(?=\r)|(?<=\d+: )BYE(?= sip:.*?\r)" | % { $_.Matches } | % { $_.Value }
        To     = Select-String -InputObject $item -Pattern "(?<=\d+: To: ).*?(?=\r)" | % { $_.Matches } | % { $_.Value }
        From   = Select-String -InputObject $item -Pattern "(?<=\d+: From: ).*?(?=\r)" | % { $_.Matches } | % { $_.Value }
    }
    if ($result.Status -ne $null -and $result.status -ne "OK") {
        $results += $result
    }
}
$results | Export-Csv -NoTypeInformation $csvPath

1 Ответ

0 голосов
/ 07 января 2020

Вот один из подходов, который использует простой (логический) конечный автомат, который может работать на вас.

[CmdletBinding()]
    param (
        [Parameter(Mandatory)]
        [string]
        $LogFile
    )$chunkCounter = 0  # 'chunk' counter
    $chunk = @() # array to hold chunks
    $recording = $false # recording state

    Get-Content $LogFile | `
        ForEach-Object { 

        if ( !$recording ) {
            If ( $_.Contains("SIP/2.0 100 Trying") ) { 
                $recording = $true
            }
        }
        else {

            $chunk += $_

            If ( $_.Contains("SIP/2.0 200 OK") ) { 

                $recording = $false
                $chunk = @()
            }
            elseif ( $_.Contains("BYE sip:" ) ) {

                $recording = $false

                "Chunk " + ($chunkCounter += 1)

                # trim first and last lines since we've recorded the "Trying" and the "BYE"
                $chunk[1..($chunk.Length - 2)]

                $chunk = @()
            }
        }
    }

Вывод:

.\parseCiscoLog.ps1 .\cisco.log
Chunk 1
492447677: To: <sip:8665095396@32.253.171.2>
492447678: Date: Fri, 03 Jan 2020 09:35:53 GMT
492447679: Call-ID: 6071103241340198@c1b08_2_4
492447732: 
492447785: 23617598: Jan  3 2020 09:35:53.742 CST: //3589444/8F3ADF6BB96C/SIP/Msg/ccsipDisplayMsg:
492447787: SIP/2.0 999 NOT OK
492447789: From: <sip:7274614191@55.66.77.88>;tag=F5F6B278-C41
492447790: To: <sip:3142093827@10.0.9.2>;tag=81980079~12263472-39ad-9427-486e-bf5a8d182fc5-45401032
492447791: Date: Fri, 03 Jan 2020 15:35:53 GMT
492447792: Call-ID: 6071103241340198@c1b08_2_4
492448015: 
492448016: 23617598: Jan  3 2020 09:35:54.621 CST: //-1/xxxxxxxxxxxx/SIP/Msg/ccsipDisplayMsg:
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...