Шаблон регулярного выражения для анализа формата HttpLog - PullRequest
7 голосов
/ 29 октября 2010

Я ищу сопоставление шаблонов регулярных выражений для строки в HttpLogFormat . Журнал генерируется haproxy . Ниже приведен пример строки в этом формате.

Feb 6 12:14:14 localhost haproxy[14389]: 10.0.1.2:33317 [06/Feb/2009:12:14:14.655] http-in static/srv1 10/0/30/69/109 200 2750 - - ---- 1/1/1/1/0 0/0 {1wt.eu} {} "GET /index.html HTTP/1.1"

Объяснение формата доступно на HttpLogFormat . Любая помощь приветствуется.

Я пытаюсь получить отдельные кусочки информации, включенные в эту строку. Вот поля:

  1. имя_процесса '[' pid ']:'
  2. client_ip ':' client_port
  3. '[' accept_date ']'
  4. frontend_name
  5. backend_name '/' server_name
  6. Tq '/' Tw '/' Tc '/' Tr '/' Tt *
  7. status_code
  8. bytes_read
  9. captured_request_cookie
  10. captured_response_cookie
  11. termination_state
  12. actconn '/' feconn '/' beconn '/' srv_conn '/' retries
  13. srv_queue '/' backend_queue
  14. '{' captured_request_headers * '}'
  15. '{' captured_response_headers * '}'
  16. '"' http_request '"'

Ответы [ 5 ]

4 голосов
/ 30 октября 2010

Regex:

^(\w+ \d+ \S+) (\S+) (\S+)\[(\d+)\]: (\S+):(\d+) \[(\S+)\] (\S+) (\S+)/(\S+) (\S+) (\S+) (\S+) *(\S+) (\S+) (\S+) (\S+) (\S+) \{([^}]*)\} \{([^}]*)\} "(\S+) ([^"]+) (\S+)" *$

Результаты:

Group 1:    Feb 6 12:14:14
Group 2:    localhost
Group 3:    haproxy
Group 4:    14389
Group 5:    10.0.1.2
Group 6:    33317
Group 7:    06/Feb/2009:12:14:14.655
Group 8:    http-in
Group 9:    static
Group 10:   srv1
Group 11:   10/0/30/69/109
Group 12:   200
Group 13:   2750
Group 14:   -
Group 15:   -
Group 16:   ----
Group 17:   1/1/1/1/0
Group 18:   0/0
Group 19:   1wt.eu
Group 20:   
Group 21:   GET
Group 22:   /index.html
Group 23:   HTTP/1.1

Я использую RegexBuddy для составления сложных регулярных выражений.

2 голосов
/ 30 октября 2010

Используйте на свой страх и риск .

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

Конечно, даже лично я бы не хотелчтобы поддерживать это, но у вас есть это.Возможно, вы захотите вместо этого написать обычный старый парсер, если можете.

Редактировать : помечено как CW, так как это скорее "интересно, как это получитсявид ответа больше всего на свете.Для краткости, это то, что я построил в рубрике:

^[^[]+\s+(\w+)\[(\d+)\]:([^:]+):(\d+)\s+\[([^\]]+)\]\s+[^\s]+\s+(\w+)\/(\w+)\s+(\d+)\/(\d+)\/(\d+)\/(\d+)\/(\d*)\s+(\d+)\s+(\d+)\s+([^\s]+)\s+([^\s]+)\s+([^\s]+)\s(\d+)\/(\d+)\/(\d+)\/(\d+)\/(\d+)\s+(\d+)\/(\d+)\s+\{([^}]*)\}\s\{([^}]*)\}\s+\"([^"]+)\"$

Моим первым языком программирования был Perl, и даже я готов признать, что меня это пугает.

1 голос
/ 30 октября 2010

Почему вы пытаетесь точно соответствовать строке? Если вы ищете в нем определенные поля, лучше укажите, какие из них, и извлеките их. Если вы хотите запускать статистику для журналов haproxy, вам следует взглянуть на инструмент «halog» в каталоге «contrib» в источниках. Возьмите тот из версии 1.4.9, он даже знает, как сортировать URL-адреса по времени ответа.

Но что бы вы ни хотели сделать с этими строками, регулярное выражение, вероятно, всегда будет самым медленным и сложным решением.

1 голос
/ 30 октября 2010

Это выглядит как очень сложная строка для соответствия.Я бы рекомендовал использовать такой инструмент, как Expresso .Начните со строки, которую вы пытаетесь сопоставить, затем начните заменять ее части нотацией Regex.

Чтобы получить отдельные части, используйте группирующие скобки.

Другой вариант - сделать регулярное выражение длякаждый кусок, который вы пытаетесь захватить.

0 голосов
/ 30 октября 2010

Я не думаю, что регулярное выражение - ваш лучший вариант здесь ... однако, если это ваш единственный вариант ...

Попробуйте вместо этого рассмотреть эти варианты.https://serverfault.com/q/62687/438

...