Как вывести последние сто строк из очень большого лог-файла (миллионы строк)?

«Как вывести последние сто строк из очень большого лог-файла (миллионы строк)?» — вопрос из категории Linux, который задают на 23% собеседований Devops Инженер. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Для эффективной работы с большими файлами важно использовать инструменты, которые не читают файл целиком. Основная команда — tail.

Базовое решение:

tail -n 100 /var/log/monolith.log

Утилита tail оптимизирована для чтения с конца файла, поэтому она справится с файлом в гигабайты быстро и с минимальным потреблением памяти.

Практические сценарии и их реализация:

  1. Слежение за логом в реальном времени после просмотра «хвоста»:

    tail -n 100 -f /var/log/monolith.log

    Флаг -f (follow) продолжит выводить новые строки по мере их записи в файл.

  2. Поиск ошибок в конце лога (комбинация с grep):

    tail -n 1000 /var/log/monolith.log | grep -i "error|exception|fatal"

    Сначала извлекаем последние 1000 строк, а затем фильтруем их. Это эффективнее, чем grep по всему файлу.

  3. Анализ лога за последний период (комбинация с since): Если в логах есть временные метки, можно использовать более умные инструменты. Например, с journalctl (для systemd):

    journalctl -u my-service --since "1 hour ago" --lines 100

    Или с awk для текстовых логов:

    awk -v since="$(date -d '1 hour ago' +'%Y-%m-%d %H:%M:%S')" '$1" "$2 >= since' /var/log/app.log | tail -100
  4. Если tail недоступен, можно использовать sed:

    sed -n '999901,1000000p' /var/log/monolith.log # Выводит строки с 999901 по 1,000,000

    Однако этот метод требует знать общее количество строк, что не всегда удобно.

Рекомендация для продакшена: Для централизованного сбора и анализа логов такого масштаба я настраиваю стэк типа ELK (Elasticsearch, Logstash, Kibana) или Loki + Grafana. Это позволяет выполнять запросы типа «показать последние 100 строк лога для сервиса X» через веб-интерфейс за секунды, независимо от размера исходных файлов.