我需要在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) );
}
}
答案 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];
}