如果此日志是使用生成的,Apache
我建议更改LogFormat
以使字符串更适合解析。但是,更改此选项可能不是一种选择。
我下面的两个建议期望日志字符串在日志参数数量方面看起来相同。
第一个选择是使用这个例子,它不包含那么多regexp
但更干净。不过可能会很慢。
public class RunMe {
public static final int AGENT_INFO_START=12;
public static void main(String[] args) {
int i=0;
StringBuffer logElement = new StringBuffer();
ArrayList<String> logElements = new ArrayList<String>();
String string = new String("06-09-2013 14:22:33 127.0.0.1 - 127.0.0.1 80 GET 304 207 410 HTTP/1.1 127.0.0.1 Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:21.0) Gecko/20100101 Firefox/21.0 cs_vi=- cs_uuid=- cs_si=- http://clickstream.local/");
String[] elements = string.split("\\s");
for(String element : elements) {
logElement.append(element);
i++;
if(i > AGENT_INFO_START && i < elements.length-4) {
logElement.append(" ");
} else {
logElements.add(logElement.toString());
logElement.setLength(0);
}
}
for(String element : logElements) {
System.out.println("Field: " + element);
}
}
}
我想regexp
这会使代码有点难以理解,因为我绝不是一个好的正则表达式生成器,所以很可能有regexp
比这个更好的。
public class RunMe {
public static void main(String[] args) {
StringBuffer logElement = new StringBuffer();
ArrayList<String> logElements = new ArrayList<String>();
String string = new String("06-09-2013 14:22:33 127.0.0.1 - 127.0.0.1 80 GET 304 207 410 HTTP/1.1 127.0.0.1 Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:21.0) Gecko/20100101 Firefox/21.0 cs_vi=- cs_uuid=- cs_si=- http://clickstream.local/");
// Put "" around all fields.
String newStr = string.replaceAll("^([0-9-]*)\\s([0-9:]*)\\s([0-9\\\\.]*)\\s(-)\\s([0-9\\\\.]*)\\s([0-9]*)\\s(GET|POST)\\s([0-9]*)\\s([0-9]*)\\s([0-9]*)\\s([a-zA-Z0-9\\\\./]*)\\s([0-9\\\\.]*)\\s(.*)\\s(cs_vi=.*)\\s(cs_uuid=.*)\\s(.*)\\s(.*)",
"\"$1\" \"$2\" \"$3\" \"$4\" \"$5\" \"$6\" \"$7\" \"$8\" \"$9\" \"$10\" \"$11\" \"$12\" \"$13\" \"$14\" \"$15\" \"$16\" \"$17\"");
String[] elements = newStr.split("\"");
for(String element : elements) {
System.out.println(element);
}
}
}