首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >它将是解析以下日志文件的java regex。

它将是解析以下日志文件的java regex。
EN

Stack Overflow用户
提问于 2012-08-20 16:32:24
回答 3查看 2.6K关注 0票数 2

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

8月15日20:35:22格林尼治时间2012 tropo109.orl.voxeo.net tropo109.orl.voxeo.net 138595 0 e467547d3333724bdd52635bbb713e77 1 d607eb64fb3bfbfd273a55f4b121b903 d607eb64fb3bfbfd273a55f4b121b903:TRANSFER,*+17877260664*

从这条线路上我需要得到电话号码和总通话时间。

8月15日20:35:22格林尼治时间2012 tropo109.orl.voxeo.net tropo109.orl.voxeo.net 138595 0 e467547d3333724bdd52635bbb713e77 1 d607eb64fb3bfbfd273a55f4b121b903测井CDR {“呼叫”:{“SipSessionID”:“ss_jzto5yd4jruv”,d607eb64fb3bfbfd273a55f4b121b903 "CallID":"d607eb64fb3bfbfd273a55f4b121b903","ParentSessionID":"none","ParentCallID":"none","DateCreated":"Wed,20128.15 20128.15 20:34:14 +0000","DateUpdated":"Wed“,2012年8月15日20:34:14 +0000,”AccountID“:"AccountID":"138595","Called":"+17877260664",“呼叫者”:“+17877058826”,“PhoneNumberSid”:“未知”,“性格”:“脚本结束”,“状态”:“成功”,"StartTime":"Wed,2012年8月15日20:34:14 +0000","EndTime":"Wed,2012年8月15日20:35:22 +0000","Duration":"67950",“标志”:“out”,"RecordingDuration":"0",“网络”:“SIP”,“频道”:“语音”,"ApplicationId":"392671",“ApplicationType”:"ServiceId":"1291899","StartUrl":"http://hosting.tropo.com/138595/www/outboud-web2ivr.groovy","BrowserIP":"10.6.69.109","PPID":"461"}}

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

更新:我得到了第一部分的代码,任何关于如何获取第二部分的指针,只有一个编译好的表达式可以在日志输入行中找到(电话、状态)或(电话,通话时间)?:

代码语言:javascript
复制
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) );
  }

}
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-08-20 21:42:30

关于第一项:

代码语言:javascript
复制
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) );
   }
}

第二阶段:

代码语言:javascript
复制
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) );
   }
}

我使用这个非常方便的工具:在查找regexes时使用http://www.regexplanet.com/advanced/java/index.html

编辑:--如果您正在寻找1正则表达式,它可能如下所示:

代码语言:javascript
复制
Pattern.compile("\\[(\\w+),\\*(\\+\\d{11})\\*].*?Called\":\"(\\+\\d{11}).*?\"Duration\":\"(\\d+)", Pattern.MULTILINE);
票数 1
EN

Stack Overflow用户

发布于 2012-08-20 17:01:20

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

票数 1
EN

Stack Overflow用户

发布于 2012-08-20 16:50:43

这都是一行还是多行?

如果第一个行是多行,那么:

代码语言:javascript
复制
String line = yourline
if(line.indexOf("SimpleOutgoingCall" != -1)
{
    String data = line.split(":")[1];
    String status = data.substring(1, data.indexOf(",")); 
}

第二行看起来与前两行不同,但{{ .}块是一行“如果是:

代码语言:javascript
复制
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];
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12041518

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档