2

我需要在java中解析一个日志文件。日志文件包含有关呼叫事务的信息。我感兴趣的行以及其中的信息在日志行条目示例中以粗体标记。对于以下我需要提取的状态和电话号码:

Aug 15 20:35:22 GMT 2012 tropo109.orl.voxeo.net TROPO 138595 0 e467547d3333724bdd52635bbb713e77 1 d607eb64fb3bfbfd273a55f4b121b903 SimpleOutgoingCall[+17877058826/null->+17877260664/null] : [ TRANSFER ,* +17877260664 *]

从这条线上我需要获取电话号码和总通话时间。

Aug 15 20:35:22 GMT 2012 tropo109.orl.voxeo.net TROPO 138595 0 e467547d3333724bdd52635bbb713e77 1 d607eb64fb3bfbfd273a55f4b121b903 Logging CDR {"call":{"SipSessionID":"ss_jzto5yd4jruv","SessionID":"e467547d3333724bdd52635bbb713e77","CallID": "d607eb64fb3bfbfd273a55f4b121b903","ParentSessionID":"none","ParentCallID":"none","DateCreated":"2012 年 8 月 15 日星期三 20:34:14 +0000","DateUpdated":"2012 年 8 月 15 日星期三 20 :34:14 +0000","AccountID":"138595","Called": "+ 17877260664 ","Caller":"+17877058826","PhoneNumberSid":"unknown","Disposition":"脚本结束" ,“地位”:”成功","开始时间":"2012 年 8 月 15 日星期三 20:34:14 +0000","结束时间":"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 "}}

所以一般来说,我需要解析一个文件,并在不同的日志行条目中获取呼叫状态和持续时间。任何指针?

更新:我得到了获取第一部分的代码,关于如何获取第二部分的任何指针,并且只有一个编译表达式可以在日志条目行中找到 (phone,status) 或 (phone,callduration)?:

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 数组,而第二部分中 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) );
   }
}

对于第二个:

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

这都是一行还是多行?

如果第一个是多行,则:

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

第二个看起来像前两个是不同的行,但是 {{ ... }} 块是一行“如果是这样:

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 回答