Реализовать утилиту, производящую анализ access.log.
На основании данного лога утилита должна уметь:
-
Выводить запросы, которые завершились ошибкой (с кодом
5XX). -
Находить промежуток времени, в который количество запросов к серверу было максимальным.
Утилита должна поддерживать следующие аргументы командной строки (опции):
| Короткий аргумент | Длинный аргумент | Значение по умолчанию | Описание |
|---|---|---|---|
-o path |
--output=path |
Путь к файлу, в который будут записаны запросы с ошибками. Если файл не указан, анализ запросов с ошибками не выполняется. | |
-p |
--print |
Продублировать вывод запросов с ошибками в stdout (стандартный поток вывода / терминал) |
|
-s n |
--stats=n |
10 |
Вывести n самых частых запросов, завершившихся со статус кодом 5XX в порядке их частоты. |
-w t |
--window=t |
0 |
Найти и вывести промежуток (окно) времени длительностью t секунд, в которое количество запросов было максимально. Eсли t равно 0, расчет не производится. |
-f |
--from=time |
Наименьшее время в логе | Время в формате timestamp, начиная с которого происходит анализ данных. |
-е |
--to=time |
Наибольшее время в логе | Время в формате timestamp, до которого происходит анализ данных (включительно) |
Название файла и опции передаются программе в виде аргументов командной строки в следующем формате:
AnalyzeLog [OPTIONS] logs_filename
В качестве примера файла логов, предлагается использовать логи сервера NASA.
Логи представляют из себя текстовый файл, где каждая строка содержит событие доступа к сереру в следующем формате:
<remote_addr> - - [<local_time>] "<request>" <status> <bytes_send>
| Значение | Описание |
|---|---|
remote_addr |
Адрес, с которого был отправлен запрос. |
local_time |
Время, в которое был получен запрос. |
request |
URL запроса. |
status |
Код ответа сервера. |
bytes_send |
Количество переданных в ответе байт. |
Пример строк из файла логов:
198.112.92.15 - - [03/Jul/2024:10:50:02 -0400] "GET /shuttle/countdown/HTTP/1.0" 200 3985
198.112.92.15 - - [03/Jul/2024:10:50:04 -0400] "GET /shuttle/nosuchpath/HTTP/1.0" 404 144
AnalyzeLog access.log --output=result.txt
AnalyzeLog access.log --output=result.txt --print --stats 5
AnalyzeLog --stats=2 --window=60 --from=805821284 --to=807117284 access.log
AnalyzeLog -s 2 access.log
AnalyzeLog -w 10 access.log
AnalyzeLog access.log -w 10
-
Стоит подумать, что размер файла может быть достаточно большим, и значительно превышать объем доступной оперативной памяти. Поэтому, потребление оперативной памяти не должно зависеть от размера файла.
-
Стоит подумать, каким образом можно разбить программу на логичные функции.
-
Не забывайте про кодстайл.
Для реализации утилиты потребуется воспользоваться стандартной библиотекой ввода/вывода. Пример использования.
С примером того, как можно организовать парсинг аргументов командной строки, можно ознакомиться здесь.
Внешние библиотеки запрещены. Разрешается пользоваться только стандартной библиотекой С или С++.
- 01.10.23 24:00 - 0.8
- 08.10.23 24:00 - 0.65
- 15.10.23 24:00 - 0.5