package com.alimama.quanjingmonitor.parser; import java.io.*; import java.net.*; import java.text.SimpleDateFormat; import java.util.*; import com.alimama.mdrillImport.InvalidEntryException; import com.alimama.mdrillImport.Parser; import com.taobao.loganalyzer.input.p4ppv.parser.*; public class AccessLogParser implements Parser { public static void main(String[] args) throws InvalidEntryException { AccessLogParser p=new AccessLogParser(); System.out.println(p.parse("114.97.229.243 0.016 16279 - [30/Oct/2013:18:11:04 +0800] \"GET http://tmatch.simba.taobao.com/?name=tbuad&count=5&q2cused=0&p4p=__p4p_sidebar__%2C__p4p_bottom__&keyword=artka%B9%D9%B7%BD%C6%EC%BD%A2%B5%EA&pid=420434_1006%2C420435_1006&sort=&ip=114.97.229.243&offset=13&rct=8&propertyid=&sbid=5&o=j&t=1383128141192\" 200 5264 \"http://s.taobao.com/search?spm=a230r.1.4.3.wmVJxl&q=artka%B9%D9%B7%BD%C6%EC%BD%A2%B5%EA&rs=up&rsclick=3&tab=all&promote=0&bcoffset=1&s=40\" ")); } public AccessLogParser() { } private static final String LOG_ENCODING = "GBK"; public static Map<String,String> getName(String url) { HashMap<String,String> rtn=new HashMap<String, String>(); try{ String[] tem = url.split("\\?", 2); String params=tem[0]; if (tem.length >= 2){ params=tem[1]; } for (String s: params.split("&", -1)) { String[] tem1 = s.split("=", -1); try { String key = URLDecoder.decode(tem1[0], LOG_ENCODING); String value = (tem1.length < 2 ? "" : URLDecoder.decode(tem1[1], LOG_ENCODING)); rtn.put(key, value); } catch (UnsupportedEncodingException uee) { } } }catch(Throwable e){} return rtn; } private static SimpleDateFormat formatter = new SimpleDateFormat("[dd/MMM/yyyy:hh:mm:ss", Locale.ENGLISH); public static class AccesLog{ public Double rt; @Override public String toString() { return "AccesLog [rt=" + rt + ", ts=" + ts + ", pid=" + pid + ", name=" + name + "]"; } public Long ts; public String pid; public String name; } public Object parse(Object raw) throws InvalidEntryException { try { if (raw == null) { throw new InvalidEntryException("Invalid log `" + String.valueOf(raw) + "'"); } String[] cols=((String)raw).split("[ ]+",-1); if (cols.length<7) { throw new InvalidEntryException("Invalid log `" + raw + "'"); } AccesLog rtn=new AccesLog(); int indexadd=0; if(cols[3].indexOf("[")<0) { indexadd=1; } rtn.rt=Double.parseDouble(cols[1+indexadd]); rtn.ts=formatter.parse(cols[3+indexadd]).getTime(); String url=cols[6+indexadd].replaceAll("\"+", ""); Map<String,String> params=getName(url); rtn.pid=params.get("pid"); rtn.name=params.get("name"); return rtn; } catch (Throwable nfe) { nfe.printStackTrace(); throw new InvalidEntryException("Invalid log `" + raw + "'\n" + nfe); } } }