Перейти к основному содержимому
Модуль 8 · Урок 2 из 430/32 в курсе~12 min
Уроки модуля (2/4)

Парсер журналов Apache

Журналы Apache (комбинированный формат) имеют четкую структуру:

Code
127.0.0.1 - - [10/Oct/2024:13:55:36 +0000] "GET /index.html HTTP/1.1" 200 1234

Шаблон с именованными группами извлекает каждое поле за один раз:

Code
^(?<ip>\d+\.\d+\.\d+\.\d+)\s+\S+\s+\S+\s+\[[^\]]+\]\s+"(?<metodo>\w+)\s+(?<path>\S+)\s+\S+"\s+(?<status>\d+)\s+(?<size>\d+)

Это выглядит чудовищно, но это конкатенация простых шаблонов:

  • (?<ip>\d+\.\d+\.\d+\.\d+) -- исходный IPv4.
  • \s+\S+\s+\S+ -- идентификаторы пользователей (обычно -).
  • \[[^\]]+\] -- дата в квадратных скобках.
  • "(?<metodo>\w+)\s+(?<path>\S+)\s+\S+" -- запрос в кавычках с указанием метода HTTP, пути и версии.
  • (?<status>\d+)\s+(?<size>\d+) -- код состояния и отправленные байты.

Общая стратегия

  1. Начните с настоящей строки и закрепите разделители: пробелы, кавычки, скобки.
  2. Между разделителями укажите тип токена (IP-адрес, слово, номер).
  3. Оберните в именованные группы только то, что необходимо извлечь.

Парсинг сложных логов

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

Попробуйте это

Упражнение#regex.m8.l2.e1
Попыток: 0Загрузка…

Извлеките IPv4 в начале каждой строки журнала как именованную группу «ip».

Загрузка редактора…
Показать подсказку

Привяжите начало строки с помощью ^ и флага m и заключите IP в (?<ip>...).

Решение доступно после 3 попыток

Обзор упражнения

Упражнение#regex.m8.l2.e2
Попыток: 0Загрузка…

Извлеките метод HTTP и путь запроса в кавычках как группы «метод» и «путь».

Загрузка редактора…
Показать подсказку

Откройте с помощью ", затем (?&lt;метод&gt;\\w+)\\s+(?&lt;путь&gt;\\S+).

Решение доступно после 3 попыток

Дополнительная задача

Упражнение#regex.m8.l2.e3
Попыток: 0Загрузка…

Extract only the date and time part enclosed in brackets in logs, e.g. `10/Oct/2024:13:55:36 +0000`, as a named group `timestamp`.

Загрузка редактора…
Показать подсказку

Use \[(?<timestamp>[^\]]+)\] to prevent the engine from matching past the closing bracket.

Решение доступно после 3 попыток