← Все проекты уровня 2
Уровень 2 · Работа с текстом и файламиВариант A

Анализатор логов

Отфильтруйте текстовый журнал по датам и уровню, сохранив точный подсчёт ошибок.

Техническое задание

Формат и поведение

Реализуйте CLI для анализа текстового файла журнала. Каждая корректная строка имеет фиксированный формат: дата и время в UTC как YYYY-MM-DDTHH:MM:SSZ, затем пробел, уровень из INFO, WARN или ERROR, затем пробел и непустое сообщение. Разделителем полей является ровно один пробел после метки времени и после уровня; оставшаяся часть строки целиком является сообщением, поэтому она может содержать пробелы. Пустые строки считаются некорректными. Файл читается построчно, а исходник никогда не изменяется.

Путь к файлу задаётся позиционно; --from и --to задают необязательные включительные границы календарной даты в формате YYYY-MM-DD, а --level принимает один или несколько перечисленных уровней через запятую. При указании нескольких уровней достаточно совпадения с любым из них. Проверьте, что начало диапазона не позже конца. Сначала разберите строку, затем примените фильтр: число ошибок показывает количество всех корректных ERROR-записей во всём файле, независимо от выбранного фильтра. Отчёт также содержит число корректных строк, число попавших под фильтр строк и список этих строк в исходном порядке. Число некорректных строк и их номера должны быть показаны отдельным разделом; повреждённые записи не входят в счётчики.

При ошибке открытия или чтения файла, неизвестном уровне фильтра, неверной дате, обратном диапазоне или неизвестном аргументе завершайте CLI с ненулевым кодом и диагностикой в stderr. Ошибки формата отдельной строки не прерывают разбор всего файла, но каждая такая строка учитывается. Укажите предельную длину строки 1 MiB; превышение считайте ошибкой чтения с указанием номера строки. Реализация должна быть детерминированной, использовать стандартную библиотеку и включать тесты для парсера и фильтрации.

Структура программы

В main.go оставьте чтение флагов, открытие файла, запуск анализа и выбор кода завершения. Разместите разбор одной строки, фильтрацию и подсчёт в отдельных функциях package main в файле анализа; оформление отчёта держите отдельно. Передавайте строки и параметры функциям, чтобы тестировать parser и правила без CLI и os.Exit.

Критерии готовности

Ожидаемый результат

Сдайте запускаемый Go-модуль с командой анализа, README с точной грамматикой строки и правилами фильтрации, а также офлайн-тестами. Отчёт должен различать общее количество ошибок и ошибки, попавшие в фильтр, чтобы пользователь не путал эти показатели. Повреждённые строки показываются с номерами и не мешают обработке последующих записей.

Критерии приёмки:

  • README описывает разбор и отчёт отдельно; парсер и фильтр тестируются без CLI.
  • строка с сообщением, содержащим пробелы, разбирается целиком;
  • диапазон дат включает обе границы;
  • фильтр ERROR выбирает только ERROR, но общий счётчик учитывает и ошибки вне диапазона;
  • неверная дата в записи увеличивает список некорректных строк;
  • пустая строка тоже диагностируется. Переполнение установленного лимита строки даёт ошибку чтения с номером, неверный CLI-параметр возвращает ненулевой код, исходный журнал остаётся побайтно неизменным.

Для ориентира

Примеры входа и результата

Строка: 2026-03-01T10:15:00Z ERROR не удалось открыть файл. Результат: корректная запись уровня ERROR с полным сообщением. Строка: вчера DEBUG что-то произошло. Результат: некорректная строка; при фильтрации она указана в диагностике и не входит в счётчики.