Как использовать tail и grep для дебагинга

Posted by     "Георгий Кузора" on Friday, September 8, 2023

Какие варианты дебагинга существуют

При отладке программы можно использовать различные стратегии для дебагинга:

Использовать дебагер

Достоинства:

  • Возможность по шагам изучить работу программы.
  • Видно состояние всех переменных в программе.

Недостатки:

  • Занимает значительное время.
  • Сложно проводить анализ при увеличении сложности программы.

Добавлять операции для вывода в терминал в код программы

Достоинства:

  • Простота добавления операции вывода.
  • Возможность анализа после завершения программы.

Недостатки:

  • “Засорение” кода программы.
  • Сложность анализа при тестировании и после запуска в продакшн.

Ипользовать логи для записи debug-сообщений

Достоинства:

  • Простота добавления в код программы.
  • Возможность анализа работы программы в продакшене.

Недостатки:

  • Сложность поиска в логах.

Как использовать tail и grep для фильтрации входящих логов

Фильтрация и вывод в терминал

Чтобы получать информацию о новых сообщениях в файле лога мы используем команду tail:

tail -f <file_name>

Эта команда будет следить за изменениями в файле. При добавлении новой строки в файл команда выведет новую строку в терминал.

На практике возникает задача фильтровать вывод программы tail. Это может быть необходимо когда система логирования в программе скидывает все логи в один файл.

В этом случае применяется комманда grep. Но по умолчанию, grep буфферизирует входящие данные. Это означает, что непрерывный вывод в терминал работать не будет.

tail -f <file_name> | grep <search_term> # Это работать не будет

Для того чтобы grep мог обрабатывал входящие строки по мере их поступления, нужно использовать специальный флаг --line-buffered:

tail -f <file_name> | grep --line-buffered <search_term>

В этом случае grep будет буфферизировать входящие данные построчно. Таким образом мы получим непрерывный вывод отфильтрованных изменений в файле лога в терминал.

Фильтрация и вывод в файл

Если необходимо выводить отфильтрованные данные в файл, по простое перенаправление потока вывода работать не будет:

tail -f <file_name> | grep --line-buffered <search_term> >> <file_name> # Это работать не будет

Это происходит из-за буфферизации потока вывода.

Для того чтобы записывать результаты работы команды в файл следует использовать команду tee:

tail -f <file_name> | grep --line-buffered <search_term> | tee <file_name>

Команда tee буферизирует входящие данные построчно. Обычно она используется для одновременного вывода потока в терминал и записи в файл. Но в данном случае она решает задачу последовательной записи новых строк в файл.