Как проанализировать журналы Apache с помощью regex в PHP

Я пытаюсь разделить эту строку в PHP:

11.11.11.11 - - [25/Jan/2000:14:00:01 +0100] "GET /1986.js HTTP/1.1" 200 932 "http://domain.com/index.html" "Mozilla/5.0 (Windows; U; Windows NT 5.1; de; rv:1.9.1.7) Gecko/20091221 Firefox/3.5.7 GTB6"

Как может разделить это на IP, дату, метод HTTP, доменное имя и браузер?

6
задан the Tin Man 2 December 2016 в 19:58
поделиться

2 ответа

Этот формат журнала похож на объединенный формат журнала Apache . Попробуйте это регулярное выражение:

/^(\S+) \S+ \S+ \[([^\]]+)\] "([A-Z]+)[^"]*" \d+ \d+ "[^"]*" "([^"]*)"$/m

Соответствующие группы следующие:

  1. удаленный IP-адрес
  2. дата запроса
  3. запрос HTTP-метод
  4. User-Agent значение

Но домен не перечислено там. Вторая строка в кавычках - это значение Referer .

12
ответ дан 8 December 2019 в 05:54
поделиться

Самым важным фактором является рассмотрение алгоритма отправки метода. При использовании статических языков каждому методу обычно назначается индекс. Имена, которые мы видим в источнике, фактически не используются во время выполнения и находятся в источнике в целях читаемости. Естественно, такие языки, как java, сохраняют их и делают доступными в отражении, но в терминах, когда вызывается метод, они не используются. Я оставлю размышления и обязательства вне этой дискуссии. Это означает, что при вызове метода runtmne просто использует смещение для поиска таблицы и вызова. Динамический язык, с другой стороны, использует имя функции для поиска карты, а затем вызывает указанную функцию. Хэш-карта всегда будет медленнее, чем поиск индекса в массиве.

-121--3204933-

Также можно попробовать

<ListView
.
.
ItemTemplate="{StaticResource CustomerDataTemplate}"
.
.
/>

, где CustomerDataTemplate является классом DataTemplate for Customer...

-121--2248095-

Необходимо получить учебное пособие по регулярным выражениям. Но вот ответ:

if (preg_match('/^(\S+) \S+ \S+ \[(.*?)\] "(\S+).*?" \d+ \d+ "(.*?)" "(.*?)"/', $line, $m)) {
  $ip = $m[1];
  $date = $m[2];
  $method = $m[3];
  $referer = $m[4];
  $browser = $m[5];
}

Берегитесь, это не имя домена в журнале, а HTTP-ссылка.

4
ответ дан 8 December 2019 в 05:54
поделиться
Другие вопросы по тегам:

Похожие вопросы: