0

私は日常業務としてVoIPソリューションを使用しています。管理しているデバイスからSIPメッセージのデバッグを受け取ることがよくあります。ただし、ほとんどの場合、これらのログには分析に必要な数よりも多くの呼び出しが含まれているため、それらを除外できれば素晴らしいと思います。

ログファイルと必要なCall-Idを指定した場合に、それらのSIPメッセージのみを含めるようにログファイルをフィルタリングできるツールが必要です。

残念ながら、SIPメッセージは複数行であるため、grepを使用した私の経験はそれを機能させるのに十分ではありません。

私はこれのためにPerlで何かをプログラムし始めましたが、取得できなかった適切な量のパラメーターがあるかどうかをチェックする以上のことはしませんでした。Perlはこれを行うのに最適な言語ですか?ここに入力の一部を含めました:

Jan 28 11:39:37.525 CET: //1393628/D5CC0586A87B/SIP/Msg/ccsipDisplayMsg:
Received: 
SIP/2.0 200 OK
Via: SIP/2.0/UDP 10.218.16.2:5060;branch=z9hG4bKB22001ED5
From: "Frankeerapparaat Secretariaat" <sip:089653717@10.210.2.49>;tag=E7E0EF64-192F
To: <sip:022046187@10.210.2.49>;tag=25079324~19cc0abf-61d9-407f-a138-96eaffee1467-27521338
Date: Mon, 28 Jan 2013 10:39:32 GMT
Call-ID: D5CCA1AE-686D11E2-A881ED01-8DFA6D70@10.218.16.2
CSeq: 102 INVITE
Allow: INVITE, OPTIONS, INFO, BYE, CANCEL, ACK, PRACK, UPDATE, REFER, SUBSCRIBE, NOTIFY
Allow-Events: presence
Supported: replaces
Supported: X-cisco-srtp-fallback
Supported: Geolocation
Session-Expires:  1800;refresher=uas
Require:  timer
P-Preferred-Identity: <sip:022046187@10.210.2.49>
Remote-Party-ID: <sip:022046187@10.210.2.49>;party=called;screen=no;privacy=off
Contact: <sip:022046187@10.210.2.49:5060>
Content-Type: application/sdp
Content-Length: 209

v=0
o=CiscoSystemsCCM-SIP 2000 1 IN IP4 10.210.2.49
s=SIP Call
c=IN IP4 10.210.2.1
t=0 0
m=audio 16844 RTP/AVP 8 101
a=rtpmap:8 PCMA/8000
a=ptime:20
a=rtpmap:101 telephone-event/8000
a=fmtp:101 0-15

Jan 28 11:39:37.529 CET: //1393628/D5CC0586A87B/SIP/Msg/ccsipDisplayMsg:
Sent: 
ACK sip:022046187@10.210.2.49:5060 SIP/2.0
Via: SIP/2.0/UDP 10.218.16.2:5060;branch=z9hG4bKB2247150A
From: "Frankeerapparaat Secretariaat" <sip:089653717@10.210.2.49>;tag=E7E0EF64-192F
To: <sip:022046187@10.210.2.49>;tag=25079324~19cc0abf-61d9-407f-a138-96eaffee1467-27521338
Date: Mon, 28 Jan 2013 10:39:36 GMT
Call-ID: D5CCA1AE-686D11E2-A881ED01-8DFA6D70@10.218.16.2
Max-Forwards: 70
CSeq: 102 ACK
Authorization: Digest username="Genk_AC_1",realm="infraxnet.be",uri="sip:022046187@10.210.2.49:5060",response="9546733290a96d1470cfe29a7500c488",nonce="5V/Jt8FHd5I8uaoahshiaUud8O6UujJJ",algorithm=MD5
Allow-Events: telephone-event
Content-Length: 0


Jan 28 11:39:37.529 CET: //1393627/D5CC0586A87B/SIP/Msg/ccsipDisplayMsg:
Sent: 
SIP/2.0 200 OK
Via: SIP/2.0/UDP 192.168.8.11:5060;branch=z9hG4bK24ecaaaa6dbd3
From: "Frankeerapparaat Secretariaat" <sip:3717@192.168.8.11>;tag=e206cc93-1791-457a-aaac-1541296cf17c-29093746
To: <sip:022046187@192.168.8.28>;tag=E7E0F8A4-EA3
Date: Mon, 28 Jan 2013 10:39:32 GMT
Call-ID: fedc8f80-10615564-45df0-b08a8c0@192.168.8.11
CSeq: 101 INVITE
Allow: INVITE, OPTIONS, BYE, CANCEL, ACK, PRACK, UPDATE, REFER, SUBSCRIBE, NOTIFY, INFO, REGISTER
Allow-Events: telephone-event
Remote-Party-ID: <sip:022046187@192.168.8.28>;party=called;screen=no;privacy=off
Contact: <sip:022046187@192.168.8.28:5060>
Supported: replaces
Supported: sdp-anat
Server: Cisco-SIPGateway/IOS-15.3.1.T
Session-Expires:  1800;refresher=uas
Require: timer
Supported: timer
Content-Type: application/sdp
Content-Disposition: session;handling=required
Content-Length: 247

v=0
o=CiscoSystemsSIP-GW-UserAgent 7276 9141 IN IP4 192.168.8.28
s=SIP Call
c=IN IP4 192.168.8.28
t=0 0
m=audio 30134 RTP/AVP 8 101
c=IN IP4 192.168.8.28
a=rtpmap:8 PCMA/8000
a=rtpmap:101 telephone-event/8000
a=fmtp:101 0-15
a=ptime:20

私が想定しているプログラムは、2つ以上の引数を取ります。ログファイルと、関心のある呼び出しの任意の数のCall-IDです。次に、関連するメッセージのみをフィルターで除外し、stdoutに出力します。

1つのSIPメッセージに空白行が含まれる場合があることに注意してください。次のメッセージは、新しいタイムスタンプが表示されたときにのみ開始されます。

4

2 に答える 2

0

これを試して

if ($subject =~ m/(?im)(Call-ID: (.+))$/) {
    $result = $2;
} else {
    $result = "";
}
于 2013-01-28T14:01:35.207 に答える
0

おそらく、以下が役立つでしょう:

use strict;
use warnings;

my %callIDs = map { $_ => 1 } splice @ARGV, 1, @ARGV - 1;
my $recordPrinted;

local $/ = '';

while (<>) {
    if ( /Call-ID:\s+(.+)/ and $callIDs{$1} ) {
        $recordPrinted = 1;
        print;
        next;
    }

    print if $recordPrinted and /\brtpmap\b/;

    $recordPrinted = 0;
}

使用法:perl scriptName.pl logFile callID [callID]

スクリプト パラメータを送信すると、最終的に@ARGV. はsplice、要素を 1 から取得 (および削除) して、ハッシュのキーを作成します。0 番目の要素はログ ファイル名です。

local $/ = '';段落モードを設定します。つまり、空白行で区切られたテキスト全体が一度に読み込まれます。正規表現は をキャプチャし、Call-IDその ID のキーが存在する場合、行が出力されます。また、そのレコードには別の「チャンク」がある可能性があるため、「レコード」が印刷されたことを示すフラグが設定されます。

レコードが印刷され、レコードの 2 番目の部分 (rtpmap) にあるフィールドが見つかった場合、そのチャンクが印刷されます。

于 2013-01-29T03:50:08.600 に答える