Разобрать apache файл журнала с java регулярным выражением - PullRequest
0 голосов
/ 18 марта 2020

Я пытался проанализировать файл журнала apache, и он работал нормально по следующему шаблону:

^([\\d.]+) (\\S+) (\\S+) \\[([\\w:/]+\\s[+\\-]\\d{4})\\] \"(.+?)\" (\\d{3}) (\\d+) \"([^\"]+)\" \"([^\"]+)\"[\\W]+

Однако он ломается со следующим журналом:

218.30.103.62 - - [17/May/2015:11:05:11 +0000] "GET /robots.txt HTTP/1.1" 200 - "-" "Sogou web spider/4.0(+http://www.sogou.com/docs/help/webmasters.htm#07)"\

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

Есть идеи? Спасибо

1 Ответ

1 голос
/ 18 марта 2020

Ваш формат:

"%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-agent}i\""

(см. здесь )

Таким образом, ваше регулярное выражение будет:

"^(\\S+) (\\S+) (\\S+) \\[(.+?)\\] \\\"(.+?)\\\" (\\d{3}) (\\S+) \\\"(.+?)\\\" \\\"(.+?)\\\"[\\W]+ $"

, где совпадают группы являются (я использую ссылки, как определено в apache документы):

  1. % h
  2. % l
  3. % u
  4. % t (без вложений [])
  5. % r
  6. %> s
  7. % b
  8. % {Referer} i
  9. % {User-agent} i

Примечание. Ваше регулярное выражение немного усложнено, и причина его сбоя заключается в том, что% b не всегда является числом - когда запрос не возвращает байтов, он будет - вместо 0.

...