2015-01-11 112 views
0

我正在寻找解析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。

感谢

+0

[Java解析日志文件]的可能的重复(http://stackoverflow.com/questions/20349184/java-parse-log-file) – Jens

回答

2

我会想出一个方法来建立从根据他们可能/预期值相匹配的各个字段块正则表达式。

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)); 
     } 
    } 

当然的,可以凑合着用到位REXA或热西乙线的rexs。

+0

很酷,它完美的作品。这个问题与IPv4有关。 – Jacob