Всем привет! Я Арман - Senior mobile QA, обитаю тут t.me/LilBugHunters, тестирую андроид уже 4 года. Сегодня хочу поделиться секретами Logcat.

Logcat в Android Studio имеет множества функций, которые ускоряют отладку, тестирование и в целом поиск нужной информации в логах. Однако, большинство в лучшем случае использует только поиск по ключевому слову и даже не подозревают как сильно могут ускорить свою работу.

Поэтому появилась идея написания этого материала. Здесь я расскажу про Logcat в Android Studio, какие у него есть возможности, как его кастомизировать и использовать по максимуму, с практическими советами в каких ситуациях та или иная фича может вам пригодиться. Материал будет полезен как начинающим тестировщикам, так и матёрым разработчикам, ведь это универсальный инструмент, ускоряющий работу, если знать о всех его хитростях.

О возможностях Logcat я недавно рассказывал на митапе посвященному мобильному тестированию, можете посмотреть его, если вам нужна визуальная демонстрация, в основном информация здесь будет повторять сказанное на митапе, однако, я постарался добавить сюда больше полезных примеров и практических советов.

Бонус: в конце поделюсь приложением для практики работы с логами в Logcat, генератор разных типов логов, c возможностью эмулировать различные ошибки по типу ANR и крашей.

Зачем нужно уметь читать логи и что такое Logcat

Чтобы статья была полезна и для начинающих, базово расскажу зачем вообще читать логи и что вообще такое Logcat, как он работает и как его найти в Android Studio.

Я думаю рассказывать зачем нужны логи разработчику, надобности нет, а вот многие тестировщики в лучшем случае просто собирают их и отдают на откуп разработчикам, не разбираясь.

Но тестировщику нужно разбираться в логах! Уметь их читать и анализировать, так как это позволяет точнее локализировать ошибку, найти стабильные шаги к воспроизведению бага, понять, что вообще происходит в системе. Например, был ли это краш из-за ошибки или приложение закрылось из-за нехватки ресурсов в системе.

Без чтения логов часто не возможно определить, клиентская ли это ошибка или бэкендовая, а это согласитесь очень важная деталь. И определение таких деталей до создания баг-репорта позволит сильно ускорить процесс фикса бага.

Logcat

Система логирования Android представляет собой набор структурированных кольцевых буферов, поддерживаемых системным процессом logd.

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

Есть два основных способа работы с Logcat: через ADB (Android Debug Bridge) – инструмент командной строки – и непосредственно из Android Studio. Здесь мы сфокусируемся на использовании Logcat в Android Studio, так как это наиболее быстрый и удобный способ работы с логами для разработчиков и тестировщиков.

В новых версиях с обновлённым интерфейсом ищите кнопку с мордочкой котика на боковой панели студии. В старых версиях будет иконка полосатого прямоугольник с надписью "Logcat" в нижней панели.

Logcat в Android Studio
Logcat в Android Studio

Если не нашли можете открыть Logcat через меню: «View» → «Tool Windows» → «Logcat» или воспользоваться строкой поиска, введя «Logcat».


Анатомия лог-сообщения

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

  • Дата и время: 2024-05-14 01:38:29.589

  • PID процесса и потока: 21704-21734

  • Имя тега: ExampleCustomTag1

  • Имя пакета приложения: com.alien.testlogsgenerator

  • Уровень лога: E (Error)

  • Сообщение: Custom message for ExampleCustomTag1 2

Обратите внимание, что сообщения о старте и остановке процесса показываются только, если есть проект открыт в Android Studio и будут отображаться независимо от заданных фильтров.

Данный тип сообщений полезен, когда вам нужно отследить запуск приложения в фоне, например, когда приходит push‑сообщение или же, если у вас в проекте несколько приложений, которые друг с другом взаимодействуют и могут разбудить друг друга.

Уровни логирования

Уровни логирования определяют важность сообщения и помогают быстро визуально ориентироваться в логах:

  • Verbose (V) - серый: Самая подробная отладочная информация, например значения переменных внутри циклов. Используйте этот уровень, когда вам нужно увидеть абсолютно всё, что происходит в вашем коде.

  • Debug (D) - голубой: Сообщения, полезные для отладки и тестирования, например вход/выход из функции, отправка сетевого запроса или получение ответа. Используйте этот уровень, чтобы следить за ходом выполнения программы.

  • Info (I) - зеленый: Стандартные информационные сообщения, например действия пользователя (нажатие на кнопку, загрузка файла), успешное подключение к базе данных. Используйте этот уровень, чтобы регистрировать важные события в вашем приложении.

  • Warn (W) - жёлтый: Предупреждения о потенциальных проблемах, которые не приводят к крашу приложения, но могут вызвать нежелательное поведение. Например, низкий уровень заряда батареи, медленное сетевое соединение, не удалось получить доступ к камере.

  • Error (E) - красный: Сообщения об ошибках, в рамках андроид разработки этот уровень присваивается как фатальным ошибкам приводящим к крашу приложения, так и к ошибкам, которые были перехвачены при обработке в try catch и не вызвали краша.

  • Assert (A) - темно-красный: Фатальные ошибки, которые приводят к аварийному завершению приложения. В рамках андроид разработки обычно не используется так как ERROR уже применяется для фатальных ошибок, однако при необходимости разработчик может вызвать сообщение этого уровня тоже.

Начало работы

Основное, что вам надо для начала работы с Logcat – это просто ввести поисковый запрос в поле фильтра, но давайте сначала посмотрим на элементы управления панели фильтрации:

  1. Дропдаун выбора активного устройства или файла логов.

Понадобится, если вы активно пользуйтесь импортом логов или когда у вас несколько подключённых девайсов.

  1. Список фильтров – показывает сохранённые и недавние фильтры, рядом с фильтром показывается количество событий соответствующих условию фильтра в текущем буфере.

Можно настроить фильтры на ошибки вашего приложения и быстро одним взглядом понимать были ли какие-то ошибки на фоне или нет. Например количество ANR или Exceptions.

  1. Окно ввода – своего рода омнибокс, куда можно сразу вводить слова для поиска, а можно использовать ключи фильтрации и логические операции для более точного поиска.

  2. Включить или выключить чувствительность поиска к регистру.

  3. Сохранить фильтр в избранные, чтобы всегда показывался в списке фильтров (2).


Фильтрация: находим нужную информацию

Без эффективной фильтрации Logcat превращается в хаотичный поток информации. К счастью, Android Studio предоставляет мощные инструменты фильтрации.

Базовый поиск

  • Просто введите ключевое слово в строку фильтрации. Logcat будет искать его во всех частях лог-сообщения.

Это может быть полезно, если вы хотите получить общую картину происходящего.

  • Когда вы тестируете/разрабатываете функциональность, которая задевает системные интерфейсы, например, создание контактов в контактной книге.

  • Когда не понятно, что происходит, иногда баг может быть на уровне системы и если что-то идет не так, а в логах пусто – есть смысл убрать все фильтры

Использование ключей фильтрации

Для более точного поиска используйте ключи:

  • tag: Фильтрация по тегу, который разработчики ставят для своих сообщений. Удобно, если вы работаете с конкретным модулем или частью кода.

    • tag:NetworkManager — отображает только логи, помеченные тегом "NetworkManager".

      При разработке новой функциональности, например, сетевого модуля, вы можете пометить все логи, связанные с этим модулем, тегом "NetworkManager". Это поможет как при отладке, так и при тестировании.

      Если функциональность сложная есть смысл добавить дополнительные более подробные логи для целей тестирования, которые будут убраны после.

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

  • package: Фильтрация по имени пакета приложения. Незаменимо, когда нужно отделить логи вашего приложения от системных сообщений или логов других приложений.

    • package:mine — покажет логи только для приложений открытых в текущем проекте в Android Studio.

    • package:com.example.myapp  — покажет логи только для com.example.myapp

      Фильтрация по имени пакета поможет вам сфокусироваться на логах вашего приложения, убрав огромное количество системных сообщений.

  • level: Фильтрация по уровню лога. Позволяет быстро отсеять менее важные сообщения и сосредоточиться на ошибках и предупреждениях.

    • Уровни можно представить себе как матрёшку, указывая самый первый уровень мы будем видеть ошибки всех уровней выше

      • указав verbose мы получим логи со всех уровней до assert

      • а указав error только  error и assert

      Если ваше приложение крашится или вы видите какое-либо другое не ожидаемое поведение, вы можете использовать level:error, чтобы быстро найти причину в логах.

  • is: Фильтрация по предустановленным условиям. Удобный способ быстро найти логи, связанные с крашами, трассировкой стека или сервисами Firebase.

    • is:crash — отображает логи, связанные с падением приложения.

    • is:stacktrace — показывает трассировку стека вызовов, которая поможет понять, где произошла ошибка.

    • is:firebase — фильтрует логи, связанные с сервисами Firebase.

    • is:{уровень логирования} — в последней версии студии (Jellyfish) также добавлены новые значения для фильтра is соответсвующие уровням логирования, теперь можно написать is:debug и тогда будут показываться сообщения только уровня debug (ни выше, не ниже).

      is:crash понятно для чего —  быстро посмотреть краш, а вот что гораздо полезнее is:stacktrace, так как стектрейсы гененируются во время исключений, но если исключение было обработано, то разработчик мог решить, что для этой ошибки не нужен был level:error так вы не пропустите все исключения, которые происходили в приложении.

      Если дебажите работу пушей, crashlytics и любых других систем firebase, то is:firebase будет сильным помощником, так как он выводит все логи, которые генярятся пакетами firebase, не зависимо от того есть там это слово или нет.

  • message: Фильтрация по тексту сообщения. Используйте этот ключ, когда нужно найти все логи, содержащие определенное слово или фразу.

    Можно использовать в регулярных выражениях и с логическими операторами (об этом будет дальше).

    Отдельно часто помогает, когда нужно отфильтровать какие-то числовые значения именно в теле лога, но если просто писать числа, то всякие даты и номера процессов тоже будут матчиться и мешать логам.

  • age: Фильтрация по возрасту лога. Пример: age:10s — покажет логи, созданные за последние 10 секунд. Можно использовать секунды - s, минуты - m, часы - h, дни - d.

    Полезно, когда вам нужно проанализировать только самые последние события, например, после выполнения определенного действия в приложении.

    Для себя придумал добавлять его в различные сохранённые фильтры, чтобы при их открытии сразу отбрасывать что-то слишком старое.

  • process: Фильтрация по имени процесса.

    Может быть полезно, если ваше приложение использует несколько процессов с разными именами, но нужно сконцентрироваться на конкретном.

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

  • name: Именование вашего запроса для отображения в списке фильтров.

    • Пример: tag:MyActivity level:error name:MyActivityErrors — сохранит фильтр с именем "MyActivityErrors".

      Да, вы можете сохранять фильтры и без имён, однако имена позволяют быстрее отличить один от другого, особенно если они начинаются одинаково. Например, с имени пакета вашего приложения.

Логические операторы и регулярные выражения

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

Важно: Регулярные выражения и оператор отрицания (-) работают только с ключами tag, package и message.

Логические операторы:

  • & (И): Логическое "И". Отображает сообщения, удовлетворяющие всем указанным критериям.

    • Пример: tag:MyActivity & level:error — покажет ошибки (Error и Assert) только из с тегом MyActivity.

      Оператор И используется по умолчанию между ключами, так что его можно не прописывать.

  • | (ИЛИ): Логическое "ИЛИ". Отображает сообщения, удовлетворяющие хотя бы одному из указанных критериев.

    • Пример: tag:MyActivity | tag:MyService — покажет логи из тегов MyActivity и MyService одновременно.

  • - (НЕ): Логическое "НЕ". Исключает сообщения, удовлетворяющие указанному критерию.

    • Пример: -message:System — исключит сообщения, у которых в теле есть слово System.

Регулярные выражения:

  • ~ (соответствие регулярному выражению): Позволяет использовать регулярные выражения для более гибкой фильтрации.

    • Пример: message~:Error.*timeout — покажет логи, содержащие слово "Error", за которым следует любой текст, а затем слово "timeout".

Пример комбинирования ключей:

(tag:MyActivity | tag:DatabaseHelper) & level:debug & -message:test

Этот фильтр покажет отладочные сообщения (level:debug) из классов MyActivity и DatabaseHelper, исключая сообщения, содержащие слово "test".

В основном использование логических и регулярных выражений полезно, когда много лишних логов, мешают найти нужную информацию, которые не получается отфильтровать одиночными ключами.


Окно вывода логов

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

Кнопки управления

В хабре нереально нормально прикрепить длинную картинку, поэтому постараюсь заменить иконки кнопок похожими emoji.

  • ? – Очистить окно логов.

  • l l – Приостановить вывод лого.

  • ↻ – Перезапустить Logcat.

  • ☰↓ – Автоматически прокручивать к последнему сообщению.

  • ↑ – Навигация к коду по стектрейсу вверх (если проект открыт в студии).

  • ↓ – Навигация к коду по стектрейсу вниз.

  • ☰↩ – Переносить текст сообщения на новые строки, если не вмещаются в окно.

  • ↙ – Импортировать чужой лог для работы с ним со своими фильтрами.

  • ↗ – Экспортировать свой буфер логов.

  • ☰ – Настройки окна вывода логов.

  • ⊞ – Разделение на несколько окон, по вертикали и горизонтали.

  • ? – Быстро снять скриншот с девайса, файл сразу сохраняется на компьютер и не надо перекидывать с телефона.

  • ? – Записать скринкаст, можно установить битрейт, чтобы видео не весило много. Аналогично скриншоту сохраняется на компьютер.

Варианты отображения

Logcat предлагает два основных вида отображения логов (кнопка ☰)

  • Standard View: показывает подробную информацию о каждом логе, включая дату, время, PID, тег и т.д.

  • Compact View: более компактное отображение, которое экономит место на экране, но показывает меньше деталей.

На деле вы можете настроить оба вида как вам удобно, хоть сделать Standard View компактным, а Compact View более подробным, для этого просто выберите modify views в выпадающем меню.

Под иконкой настройки view можно найти кнопку разделения панелей (Split panels). Функция позволяет разделить окно два и более окон, каждый со своим фильтром. Также те же самые действия доступны при нажатии правой кнопкой в любом месте окна вывода логов.

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

Импорт и экспорт логов

Одна из малозаметных, но очень полезных фич это импорт и экспорт логов. Она позволяет поделиться логами приложения, но не просто в текстовом формате, а в json, который можно импортировать в Logcat и быстро отфильтровать информацию с помощью всех тех инструментов, что были описаны выше.

Logcat также автоматически сохраняет базовую инфу по девайсу, с которого собраны логи, такую как название и версия os.

Если делитесь логами с разработчиком, попросите увеличить размер буфела логов в настройках, так как если логов больше чем его буфер, то они не отобразятся. Это скорее всего баг студии, но пока так.

Меню правой кнопки

Нажав правую кнопку на сообщении откроется меню с широким набором возможностей. Некоторые кнопки будут показываться в зависимости от того по какому типу элемента вы нажали.

  • Copy Message Text – позволяет скопировать именно текст сообщения без тегов, названий пакетов и прочего.

  • Fold Lines Like This – можно настроить ключевые слова, по которым строчки их содержащие, будут автоматически сворачиваться. Предварительно туда включены разные ключевые слова для сворачивания строк в стректрейсах содержащих системные вызовы. Такие строчки помечены зелёной надписью <x internal lines> их можно раскрыть.

  • Add "строчка с ключём" to Filter – позволяет добавить в правила фильтрации тэг или пакет по которому вы нажали правой кнопкой.

  • Ignore Tag "имя тэга" – полностью убирает тэг из окна выводов, чтобы вернуть нужно будет открывать настройки Logcat в настройках студии.

  • {} Create a Scratch File from JSON – доступно, если в теле лога есть валидный JSON, создаёт отформатированный файл, который удобно читать или поделиться.

  • Force stop application – принудительная остановка приложения, доступно только для debug сборок приложений.

  • Kill process – убийство конкретного процесса.

  • Crash application – эмуляция краша, может быть полезно при тестировании восстановления приложения после падений.

Настройки Logcat

Чтобы открыть настройки Logcat переходим Android studio > Preferences > Tools >  Logcat. Настроек не так много:

  • Поставить буфер побольше, чтобы случайно не затёрлись важные логи во время тестирования. Но будьте осторожны из-за большого буфера могут быть фризы и лаги студии.

  • Настроить фильтр по умолчанию.

  • Добавить или убрать тэги для игнорирования.


Приложение для практики работы с логами

Если вы пока начинающий тестировщик, и у вас нет под рукой реального приложения для отслеживания логов, или если ваши приложения никогда не падают и в них нет ошибок – я написал маленькое приложение, которое умеет генерировать разные типы логов и эмулировать классические ошибки такие как ANR, Crash и др.

Скачать можно здесь: https://github.com/armmurr/AndroidTestLogsGenerator

Планирую дополнить его модулем с практическими заданиями, где можно попробовать по логам понять что пошло не так, а потом проверить себя. Так что ставьте звёздочки и следите за обновлениями.

А пока можете самостоятельно эмулировать сценарии и попробовать отыскать их в логах. Например, на уровне логирования Info вы найдёте события нажатий кнопок и другую информацию о действиях в приложении.


Спасибо, что дочитали, надеюсь статья оказалась полезной! Также делюсь разными ценными материалами у себя в телеграм t.me/LilBugHunters подписывайтесь и давайте оставаться на связи! Также можете писать мне в linkedin.

Комментарии (2)


  1. suprunchuk
    24.06.2024 08:36

    Арман, спасибо огромное!! Очень полезно!! Ждем еще таких крутых статей и видео.


  1. spnkl
    24.06.2024 08:36

    Спасибо огромное, очень все хорошо расписано