Модульні уроки (2/4)
Парсер журналів Apache
Журнали Apache (комбінований формат) мають точну структуру:
127.0.0.1 - - [10/Oct/2024:13:55:36 +0000] "GET /index.html HTTP/1.1" 200 1234Шаблон із іменованими групами виділяє кожне поле за один кадр:
^(?<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+)-- код стану та надіслані байти.
Загальна стратегія
- Почніть із справжнього рядка та закріпіть роздільники: пробіли, лапки, дужки.
- Між роздільниками вкажіть тип токена (IP, слово, число).
- Загортайте в іменовані групи лише те, що вам потрібно видобути.
Розбір складних журналів
Під час аналізу журналу поля зазвичай розділяються пробілами, за винятком випадків, коли вони містять рядки в лапках або дужки (наприклад, агент користувача). Використання виключених класів символів замість крапки підстановки запобігає неправильному об’єднанню кількох стовпців.
Спробуйте
Витягніть IPv4 на початку кожного рядка журналу як іменовану групу «ip».
Показати підказку
Прив’яжіть до початку рядка за допомогою ^ і прапорця m і загорніть IP у (?<ip>...).
Рішення доступне після 3 спроб
Повторна вправа
Витягніть метод HTTP та шлях запиту між лапками, як групи `metodo` і `path`.
Показати підказку
Відкрийте за допомогою ", потім (?<metodo>\\w+)\\s+(?<шлях>\\S+).
Рішення доступне після 3 спроб
Додатковий виклик
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 спроб