Разбор записей журнала Jetty - PullRequest
0 голосов
/ 20 апреля 2011

Для данного примера ввода:

70.80.110.200 -  -  [12/Apr/2011:05:47:34 +0000] "GET /notify/click?r=http://www.xxxxxx.com/hello_world&rt=1302587231462&iid=00000 HTTP/1.1" 302 0 "-" "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.0; Trident/4.0; FunWebProducts; HotbarSearchToolbar 1.1; SLCC1; .NET CLR 2.0.50727; Media Center PC 5.0; .NET CLR 3.5.30729; .NET CLR 3.0.30729; .NET4.0C; AskTbFWV5/5.11.3.15590)" 4 4

Я хотел бы определить следующую логику синтаксического анализа (возможно, регулярное выражение)

  1. Извлечь IP (3 цифры, точка) *4 => 70.80.110.200
  2. Извлечь дату => 12 / Апр / 2011
  3. Извлечь время => 05: 47: 34
  4. Извлечь URI (начинается с\ "и заканчивается \").=> / уведомить / нажать? r = http://www.xxxxxx.com/hello_world&rt=1302587231462&iid=00000

Ответы [ 4 ]

3 голосов
/ 20 апреля 2011

Попробуйте с помощью:

/^([0-9.]+).*?\[(\d+\/\w+\/\d+):(\d+:\d+:\d+).*?\].*?(\/[^ ]*).*$/

Как и следовало ожидать, в следующих группах (1, 2, 3, 4) вы получите все данные, которые вы указали - например, .group(3) - это время.

2 голосов
/ 20 апреля 2011

Убедитесь, что Jetty настроен на ведение журналов, совместимых с NSCA, тогда вы можете использовать любой анализатор журналов NCSA для анализа журналов.

Если вы хотите сделать это вручную, то это хороший вариант использования регулярных выражений.

1 голос
/ 20 апреля 2011

Полный пример кода (на основе ответа hsz ):

import java.util.*;
import java.util.regex.*;

public class RegexDemo {

  public static void main( String[] argv ) {
    String pat = "^([0-9.]*).*?\\[(\\d+\\/\\w+\\/\\d+):(\\d+:\\d+:\\d+).*?\\].*?(\\/[^ ]*).*$";
    Pattern p = Pattern.compile(pat);
    String target = "70.80.110.200 -  -  [12/Apr/2011:05:47:34 +0000] \"GET /notify/click?r=http://www.xxxxxx.com/hello_world&rt=1302587231462&iid=00000 HTTP/1.1\" 302 0 \"-\" \"Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.0; Trident/4.0; FunWebProducts; HotbarSearchToolbar 1.1; SLCC1; .NET CLR 2.0.50727; Media Center PC 5.0; .NET CLR 3.5.30729; .NET CLR 3.0.30729; .NET4.0C; AskTbFWV5/5.11.3.15590)\" 4 4";
    Matcher m = p.matcher(target);
    System.out.println("pattern: " + pat);
    System.out.println("target: " + target);

    if (m.matches()) {
      System.out.println("found");
      for (int i=0; i <= m.groupCount(); ++i) {
        System.out.println(m.group(i));
      }
    }
  }
}
0 голосов
/ 20 апреля 2011

Вы можете попробовать следующее:

String s = "70.80.110.200 -  -  [12/Apr/2011:05:47:34 +0000] \"GET /notify/click?r=http://www.xxxxxx.com/hello_world&rt=1302587231462&iid=00000 HTTP/1.1\" 302 0 \"-\" \"Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.0; Trident/4.0; FunWebProducts; HotbarSearchToolbar 1.1; SLCC1; .NET CLR 2.0.50727; Media Center PC 5.0; .NET CLR 3.5.30729; .NET CLR 3.0.30729; .NET4.0C; AskTbFWV5/5.11.3.15590)\" 4 4";
Pattern p = Pattern.compile("^(\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}).*?\\" + //ip
                            "[([^:]*):"+ //date
                            "(\\d{2}:\\d{2}:\\d{2}).*?\\].*?"+ //time
                            "(/[^\\s]*).*$"); //uri

Matcher m = p.matcher(s);
if(m.find()){
    String ip = m.group(1);
    String date = m.group(2);
    String time = m.group(3);
    String uri = m.group(4);
}
...