Перейти до основного вмісту
Модуль 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 та шлях запиту між лапками, як групи `metodo` і `path`.

Завантаження редактора…
Показати підказку

Відкрийте за допомогою ", потім (?<metodo>\\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 спроб