我需要用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"}}“
因此,一般来说,我需要解析一个文件,并且在不同的日志行中,条目获得调用状态和持续时间。有什么指示吗?
更新:我得到了第一部分的代码,任何关于如何获取第二部分的指针,只有一个编译好的表达式可以在日志输入行中找到(电话、状态)或(电话,通话时间)?:
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) );
}
}发布于 2012-08-20 21:42:30
关于第一项:
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) );
}
}我使用这个非常方便的工具:在查找regexes时使用http://www.regexplanet.com/advanced/java/index.html。
编辑:--如果您正在寻找1正则表达式,它可能如下所示:
Pattern.compile("\\[(\\w+),\\*(\\+\\d{11})\\*].*?Called\":\"(\\+\\d{11}).*?\"Duration\":\"(\\d+)", Pattern.MULTILINE);发布于 2012-08-20 17:01:20
在我看来,第一个部分中":“之后的日志部分看起来像一个JSON,第二节中CDR之后的日志部分看起来像一个JSON。您可以使用您选择的任何语言的简单JSON库来转换这些日志部分,并以结构化的方式访问所需的信息:http://json.org
发布于 2012-08-20 16:50:43
这都是一行还是多行?
如果第一个行是多行,那么:
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];
}https://stackoverflow.com/questions/12041518
复制相似问题