Уроки модуля (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 и путь запроса в кавычках как группы «метод» и «путь».
Показать подсказку
Откройте с помощью ", затем (?<метод>\\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 попыток