Ответ
Для эффективной работы с большими файлами важно использовать инструменты, которые не читают файл целиком. Основная команда — tail.
Базовое решение:
tail -n 100 /var/log/monolith.log
Утилита tail оптимизирована для чтения с конца файла, поэтому она справится с файлом в гигабайты быстро и с минимальным потреблением памяти.
Практические сценарии и их реализация:
-
Слежение за логом в реальном времени после просмотра «хвоста»:
tail -n 100 -f /var/log/monolith.logФлаг
-f(follow) продолжит выводить новые строки по мере их записи в файл. -
Поиск ошибок в конце лога (комбинация с
grep):tail -n 1000 /var/log/monolith.log | grep -i "error|exception|fatal"Сначала извлекаем последние 1000 строк, а затем фильтруем их. Это эффективнее, чем
grepпо всему файлу. -
Анализ лога за последний период (комбинация с
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 -
Если
tailнедоступен, можно использоватьsed:sed -n '999901,1000000p' /var/log/monolith.log # Выводит строки с 999901 по 1,000,000Однако этот метод требует знать общее количество строк, что не всегда удобно.
Рекомендация для продакшена: Для централизованного сбора и анализа логов такого масштаба я настраиваю стэк типа ELK (Elasticsearch, Logstash, Kibana) или Loki + Grafana. Это позволяет выполнять запросы типа «показать последние 100 строк лога для сервиса X» через веб-интерфейс за секунды, независимо от размера исходных файлов.