使用正则表达式解析日志
Parse log with regular expression
我正在寻找一种解析 Varnish
日志文件的解决方案。看起来像:
178.232.38.87 - - [23/May/2012:14:01:05 +0200] "GET http://static.vg.no/iphone/js/front-min.js?20120509-1 HTTP/1.1" 200 2013 "http://touch.vg.no/" "Mozilla/5.0 (Linux; U; Android 2.3.3; en-no; HTC Nexus One Build/GRI40) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1"
可以区分以下元素:
%h %l %u %t "%r" %s %b "%{Referer}i" "%{User-agent}i"
但我仍然不知道该怎么做。简单 String.split(" ");
行不通。
我知道正则表达式有一般规则,但最合适的是 java 一个。
谢谢
我想出了一种方法,可以根据 possible/expected 值从匹配各个字段的块构建正则表达式。
String rexa = "(\d+(?:\.\d+){3})"; // an IP address
String rexs = "(\S+)"; // a single token (no spaces)
String rexdt = "\[([^\]]+)\]"; // something between [ and ]
String rexstr = "\"([^\"]*?)\""; // a quoted string
String rexi = "(\d+)"; // unsigned integer
String rex = String.join( " ", rexa, rexs, rexs, rexdt, rexstr,
rexi, rexi, rexstr, rexstr );
Pattern pat = Pattern.compile( rex );
Matcher mat = pat.matcher( h );
if( mat.matches() ){
for( int ig = 1; ig <= mat.groupCount(); ig++ ){
System.out.println( mat.group( ig ) );
}
}
当然可以用 rexs 代替 rexa 或 rexi。
我正在寻找一种解析 Varnish
日志文件的解决方案。看起来像:
178.232.38.87 - - [23/May/2012:14:01:05 +0200] "GET http://static.vg.no/iphone/js/front-min.js?20120509-1 HTTP/1.1" 200 2013 "http://touch.vg.no/" "Mozilla/5.0 (Linux; U; Android 2.3.3; en-no; HTC Nexus One Build/GRI40) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1"
可以区分以下元素:
%h %l %u %t "%r" %s %b "%{Referer}i" "%{User-agent}i"
但我仍然不知道该怎么做。简单 String.split(" ");
行不通。
我知道正则表达式有一般规则,但最合适的是 java 一个。
谢谢
我想出了一种方法,可以根据 possible/expected 值从匹配各个字段的块构建正则表达式。
String rexa = "(\d+(?:\.\d+){3})"; // an IP address
String rexs = "(\S+)"; // a single token (no spaces)
String rexdt = "\[([^\]]+)\]"; // something between [ and ]
String rexstr = "\"([^\"]*?)\""; // a quoted string
String rexi = "(\d+)"; // unsigned integer
String rex = String.join( " ", rexa, rexs, rexs, rexdt, rexstr,
rexi, rexi, rexstr, rexstr );
Pattern pat = Pattern.compile( rex );
Matcher mat = pat.matcher( h );
if( mat.matches() ){
for( int ig = 1; ig <= mat.groupCount(); ig++ ){
System.out.println( mat.group( ig ) );
}
}
当然可以用 rexs 代替 rexa 或 rexi。