Команда adb logcat без параметров выдаёт общий поток системных сообщений, в котором записи нужного приложения тонут среди тысяч строк от системных служб, и найти конкретную ошибку становится почти невозможно. Именно поэтому фильтрация логов по конкретному приложению — базовый навык при отладке Android-приложений, анализе падений и проверке сетевых запросов. Ниже разберём рабочие способы: от фильтрации по PID до комбинированных выражений с регулярными выражениями.
Все команды приведены для стандартного Android SDK Platform-Tools и работают в терминале Windows, macOS и Linux. Перед началом убедитесь, что на устройстве включена отладка по USB, а команда adb devices показывает подключённый девайс со статусом device.
Как logcat устроен и почему фильтрация обязательна
Система логирования Android собирает сообщения из всех процессов в циклические буферы. Каждая запись содержит дату, время, PID (идентификатор процесса), TID (идентификатор потока), уровень важности, тег и текст сообщения. Уровни важности идут от Verbose (самый подробный) до Assert (критический).
Проблема в том, что системные компоненты пишут в лог постоянно: сетевые стеки, планировщик, графическая подсистема, фоновые службы. За секунду может пройти десятки и сотни строк. Без фильтра разработчик вынужден вручную прокручивать этот поток, что отнимает время и приводит к пропущенным ошибкам.
- 🔍 Фильтр по PID — самый точный способ, показывает только процесс приложения.
- 🏷️ Фильтр по тегу — удобен, если приложение использует осмысленные теги в вызовах
Log.d(). - 📦 Фильтр по имени пакета — доступен в новых версиях Android через ключ
--pidв связке с поиском PID. - 🧹 Очистка буфера перед тестом помогает убрать старый шум и видеть только свежие события.
Способ 1: фильтрация по PID приложения
Самый надёжный метод — узнать PID процесса приложения и отфильтровать лог по нему. Сначала запустите приложение на устройстве, затем выполните поиск процесса по имени пакета:
adb shell pidof com.example.myapp
Команда вернёт число — это и есть PID. Если pidof недоступен на конкретной версии оболочки, используйте альтернативу: adb shell ps | grep com.example.myapp. На некоторых прошивках вместо grep потребуется findstr или другой синтаксис — это зависит от окружения.
Далее подставьте полученный PID в фильтр logcat:
adb logcat --pid=12345
Здесь 12345 — пример PID, у вас будет своё значение. Ключ --pid поддерживается в свежих версиях Platform-Tools. Если ваша версия утилиты его не распознаёт, обновите Platform-Tools через SDK Manager или скачайте актуальный пакет с официального сайта для разработчиков Android.
⚠️ Внимание: PID меняется при каждом перезапуске приложения. Если приложение упало и система пересоздала процесс, старый фильтр перестанет показывать записи — PID нужно получить заново.
Способ 2: фильтрация по тегу и уровню важности
Классический синтаксис logcat — фильтрационные выражения вида Тег:Уровень. Например, если приложение пишет логи с тегом MyApp, команда будет такой:
adb logcat MyApp:D *:S
Здесь MyApp:D означает «показывать тег MyApp с уровня Debug и выше», а :S глушит все остальные теги (уровень Silent). Без :S вы снова получите полный поток системных сообщений — это частая ошибка новичков.
Можно указать несколько тегов одновременно. Например, adb logcat MyApp:D NetworkLib:W *:S покажет отладочные сообщения вашего приложения и предупреждения сетевой библиотеки. Такой подход удобен, когда падение связано с взаимодействием нескольких компонентов.
Ограничение метода очевидно: он работает, только если вы знаете теги, которые использует приложение. Для чужих приложений без исходного кода теги придётся выяснять опытным путём — запустите полный лог, воспроизведите действие и посмотрите, какие теги появляются в момент ошибки.
Способ 3: фильтрация по тексту через grep
Универсальный вариант, не зависящий от версии утилит, — передать вывод logcat в grep и искать по имени пакета или любой подстроке:
adb logcat | grep "com.example.myapp"
В Windows в командной строке вместо grep используется findstr: adb logcat | findstr "com.example.myapp". В PowerShell доступен и Select-String. Такой подход ловит строки, где имя пакета встречается в тексте сообщения — например, в стектрейсах падений и системных уведомлениях о процессе.
Минус метода: он не покажет записи, где имя пакета не упоминается явно, даже если они относятся к процессу приложения. Поэтому для полной картины grep-фильтр лучше комбинировать с фильтром по PID.
☑️ Подготовка к снятию логов приложения
Очистка буфера и сохранение логов в файл
Перед воспроизведением ошибки полезно очистить буфер, чтобы в вывод попали только свежие события. Для этого выполните adb logcat -c, затем запустите запись с фильтром и повторите действия, вызывающие проблему.
Для сохранения лога в файл перенаправьте вывод:
adb logcat --pid=12345 > app_log.txt
Файл пригодится для анализа после теста, отправки коллегам или прикрепления к баг-репорту. Чтобы остановить запись, нажмите Ctrl+C в терминале. Если лог нужен не в реальном времени, а «снимком», добавьте ключ -d — утилита выведет текущее содержимое буфера и завершит работу.
| Задача | Команда | Комментарий |
|---|---|---|
| Узнать PID приложения | adb shell pidof имя.пакета | Приложение должно быть запущено |
| Фильтр по PID | adb logcat --pid=PID | Требуется свежая версия Platform-Tools |
| Фильтр по тегу | adb logcat Tag:D :S | :S глушит остальные теги |
| Поиск по тексту | adb logcat | grep "строка" | В Windows — findstr |
| Очистка буфера | adb logcat -c | Удаляет накопленные записи |
Типичные проблемы и их решения
Одна из распространённых ситуаций — команда --pid возвращает ошибку «unrecognized option». Причина почти всегда в устаревшей версии Platform-Tools. Проверьте версию командой adb version и обновите пакет. Как временное решение используйте связку с grep по PID в начале строки.
Вторая типичная жалоба: фильтр по тегу ничего не показывает. Проверьте, что приложение действительно пишет логи — релизные сборки часто отключают вызовы Log.d() через ProGuard/R8 или условную компиляцию. Также убедитесь, что вы не забыли *:S и не смотрите на общий поток, где нужные строки просто теряются.
⚠️ Внимание: на некоторых устройствах (особенно с китайскими прошивками) системный логгер может быть ограничен производителем, и часть сообщений приложений в logcat не попадает. Если логи пустые при всех корректных командах, проверьте настройки разработчика конкретной прошивки — точный путь зависит от модели, сверяйтесь с её документацией.
Третья проблема — лог обрывается при отключении приложения. Это ожидаемо: процесс завершился, PID перестал существовать. Для анализа падений используйте adb logcat -b crash (буфер падений) или ищите записи AndroidRuntime с фатальными исключениями в общем логе.
Формат вывода logcat
Ключ -v меняет формат строк. Например, adb logcat -v time показывает метки времени, -v threadtime добавляет PID и TID, а -v brief выводит компактный вид. Комбинируйте: adb logcat -v threadtime --pid=12345.
Альтернатива: Logcat в Android Studio
Если приложение ваше и установлена Android Studio, встроенное окно Logcat выполняет ту же задачу через графический интерфейс: там есть выпадающий список процессов, поле поиска, фильтры по уровню и поддержка регулярных выражений. Современные версии среды позволяют строить запросы вида package:mine level:warn.
Терминальный adb logcat при этом остаётся незаменимым для автоматизации, удалённой отладки, работы на машинах без IDE и ситуаций, когда лог нужно быстро сохранить в файл или передать в скрипт. Оба инструмента используют один и тот же системный механизм, поэтому навыки фильтрации взаимозаменяемы.
⚠️ Внимание: logcat может содержать чувствительные данные — токены, идентификаторы, персональную информацию, если приложение их логирует. Перед отправкой файла лога третьим лицам просмотрите его и удалите конфиденциальные фрагменты.
Часто задаваемые вопросы
Как отфильтровать logcat по приложению, если оно не запущено?
Сначала запустите приложение — без живого процесса PID не существует. Можно запустить его удалённо: adb shell monkey -p имя.пакета 1, затем сразу получить PID и начать запись лога.
Почему фильтр по тегу показывает пустой вывод?
Вероятные причины: тег указан с ошибкой, приложение не пишет логи этого уровня (релизная сборка без отладочного логирования) или вы забыли добавить *:S и смотрите не на тот вывод. Проверьте тег в исходном коде или в полном логе.
Работает ли --pid на старых версиях adb?
Нет, ключ --pid появился в относительно свежих версиях Platform-Tools. На старых версиях используйте adb logcat | grep " PID " с подстановкой номера процесса или обновите инструменты.
Как сохранить лог только с ошибками приложения?
Комбинируйте фильтры: adb logcat --pid=PID *:E > errors.txt — уровень E отфильтрует только ошибки и фатальные исключения, а перенаправление сохранит результат в файл.
Можно ли фильтровать логи системных событий по приложению?
Да, часть системных событий (запуск Activity, падения, ANR) содержит имя пакета в тексте. Используйте adb logcat | grep "имя.пакета" или буфер событий adb logcat -b events с тем же текстовым фильтром.