2

Javaでログファイルを解析する必要があります。ログファイルには、呼び出しトランザクションに関する情報が含まれています。興味のある行とその中の情報は、ログ行エントリの例で太字でマークされています。次のものについては、ステータスと電話番号を抽出する必要があります。

8月15日20:35:22GMT2012 tropo109.orl.voxeo.net TROPO 138595 0 e467547d3333724bdd52635bbb713e77 1 d607eb64fb3bfbfd273a55f4b121b903 SimpleOutgoingCall [+ 17877058826 / null- > + 17877260664 / null]:[転送

この回線から、電話番号と合計通話時間を取得する必要があります。

Aug 15 20:35:22 GMT 2012 tropo109.orl.voxeo.net TROPO 138595 0 e467547d3333724bdd52635bbb713e77 1 d607eb64fb3bfbfd273a55f4b121b903 Logging CDR {"call":{"SipSessionID": "ss_jzto5yd4j "d607eb64fb3bfbfd273a55f4b121b903"、 "ParentSessionID": "none"、 "ParentCallID": "none"、 "DateCreated": "Wed、15 Aug 2012 20:34:14 +0000"、 "DateUpdated": "Wed、15 Aug 2012 20 :34:14 +0000 "、" AccountID ":" 138595 "、" Called ":" +17877260664 "、" Caller ":" + 17877058826 "、" PhoneNumberSid ":" unknown "、" Disposition ":"スクリプトが終了しました " 、"状態":"成功"、" StartTime ":"水、2012年8月15日20:34:14 +0000 "、" EndTime ":"水、2012年8月15日20:35:22 +0000 "、"期間 ":" 67950"、" Flags ":" out "、" RecordingDuration ":" 0 "、" Network ":" SIP "、" Channel ":" VOICE "、" ApplicationId ":" 392671"、" ApplicationType ":" groovy "、 "ServiceId": "1291899"、 "StartUrl": "http://hosting.tropo.com/138595/www/outboud-web2ivr.groovy"、 "BrowserIP": "10.6.69.109"、 "PPID": "461 "}}

したがって、一般的にはファイルを解析する必要があり、さまざまなログ行内のエントリが呼び出しステータスと期間を取得します。ポインタはありますか?

更新:最初の部分を取得するためのコード、2番目の部分を取得する方法に関するポインターを取得し、ログエントリ行内で(phone、status)または(phone、callduration)を検出するコンパイル済みの式を1つだけ持っていますか?:

private static void matchParts( String aText ){

  Pattern pattern = Pattern.compile("(?:\\[(\\w(\\w)*),(\\+\\d{11})\\])");
  Matcher matcher = pattern.matcher(aText );
  String phone;
      String status;
  while (matcher.find()) {
         System.out.println("phone:" +matcher.group(3) + ", status: "+matcher.group(1) );
  }

}
4

3 に答える 3

1

私には、最初のセクションの「:」の後のログの部分はJSON配列のように見え、2番目のセクションのCDRの後のログの部分はJSONマップのように見えます。任意の言語の単純なJSONライブラリを使用して、これらのログセクションを変換し、構造化された方法で必要な情報にアクセスできます。http: //json.org

于 2012-08-20T17:01:20.163 に答える
1

最初のものの場合:

private static void matchParts(String line){
   Pattern pattern = Pattern.compile(": \\[(\\w+),\\*(\\+\\d{11})\\*]");
   Matcher matcher = pattern.matcher(line);
   String phone;
   String status;
   while (matcher.find()) {
      System.out.println("phone:" +matcher.group(2) + ", status: "+matcher.group(1) );
   }
}

2番目の場合:

private static void matchParts(String line){
   Pattern pattern = Pattern.compile("Called\":\"(\\+\\d{11}).*\"Duration\":\"(\\d+)");
   Matcher matcher = pattern.matcher(line);
   String phone;
   String status;
   while (matcher.find()) {
      System.out.println("phone:" +matcher.group(1) + ", duration: "+matcher.group(2) );
   }
}

正規表現の検索に関しては、 http: //www.regexplanet.com/advanced/java/index.htmlという非常に便利なツールを使用しています。

編集: 代わりに1つの正規表現を探している場合は、次のようになります。

Pattern.compile("\\[(\\w+),\\*(\\+\\d{11})\\*].*?Called\":\"(\\+\\d{11}).*?\"Duration\":\"(\\d+)", Pattern.MULTILINE);
于 2012-08-20T21:42:30.923 に答える
0

これはすべて1行ですか、それとも複数行ですか。

最初の行が複数行の場合、次のようになります。

String line = yourline
if(line.indexOf("SimpleOutgoingCall" != -1)
{
    String data = line.split(":")[1];
    String status = data.substring(1, data.indexOf(",")); 
}

2番目のものは最初の2つが異なる行のように見えますが、{{...}}ブロックは1行です "その場合:

String line = yourline
String data = line.split(",");
String called, duration;
for(int x = 0; x < data.length; x++)
{
    if(data[x].indexOf("Called") != -1)
        called = data[x].split(":")[1];
    if(data[x].indexOf("Duration") != -1)
        duration = data[x].split(":")[1];
}
于 2012-08-20T16:50:43.663 に答える