Какие варианты дебагинга существуют
При отладке программы можно использовать различные стратегии для дебагинга:
Использовать дебагер
Достоинства:
- Возможность по шагам изучить работу программы.
- Видно состояние всех переменных в программе.
Недостатки:
- Занимает значительное время.
- Сложно проводить анализ при увеличении сложности программы.
Добавлять операции для вывода в терминал в код программы
Достоинства:
- Простота добавления операции вывода.
- Возможность анализа после завершения программы.
Недостатки:
- “Засорение” кода программы.
- Сложность анализа при тестировании и после запуска в продакшн.
Ипользовать логи для записи 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
буферизирует входящие данные построчно. Обычно она используется для одновременного вывода потока в терминал и записи в файл. Но в данном случае она решает задачу последовательной записи новых строк в файл.