这将是解析以下日志文​​件的java正则表达式

时间:2012-08-20 16:32:25

标签: java regex parsing

我需要在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   记录CDR   { “呼”:{ “SipSessionID”: “ss_jzto5yd4jruv”, “会话ID”: “e467547d3333724bdd52635bbb713e77”, “呼叫标识”: “d607eb64fb3bfbfd273a55f4b121b903”, “ParentSessionID”: “无”, “ParentCallID”: “无”, “dateCreated会”: “星期三,   2012年8月15日20:34:14 +0000“,”DateUpdated“:”星期三,2012年8月15日20:34:14   0000" , “帐户ID”: “138595”, “调用”: “的 17877260664 ”, “主叫方”: “+ 17877058826”, “PhoneNumberSid”: “未知”, “配置”:”脚本   结束“,”状态“:”成功“,”开始时间“:”星期三,2012年8月15日20:34:14   +0000“,”EndTime“:”Wed,2012年8月15日20:35:22 +0000“,”持续时间“:” 67950 “,”Flags“:”out“,”RecordingDuration“: “0”, “网络”: “SIP”, “通道”: “VOICE”, “的applicationID”: “392671”, “ApplicationType”: “常规”, “SERVICEID”: “1291899”, “StartUrl”:“HTTP ://hosting.tropo.com/138595/www/outboud-web2ivr.groovy”, “BrowserIP”: “10.6.69.109”, “PPID”: “461”}}

因此,一般来说,我需要解析一个文件,并在不同的日志行条目中获取呼叫状态和持续时间。有什么指针吗?

更新: 我得到了代码来获取第一部分,任何指针如何获得第二部分,并且只有一个编译表达式可以在日志输入行中找到(电话,状态)或(电话,校准)?:

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) );
  }

}

3 个答案:

答案 0 :(得分:1)

对我来说,第一个中“:”之后的日志部分看起来像JSON数组,第二部分中CDR之后的日志部分看起来像JSON Map。您可以使用您选择的任何语言的简单JSON库来转换这些日志部分并以结构化方式访问所需信息:http://json.org

答案 1 :(得分: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);

答案 2 :(得分: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];
}