Инструмент командной строки Logcat

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

На этой странице рассказывается об инструменте logcat , запускаемом из командной строки, но вы также можете просмотреть сообщения журнала из окна Logcat в Android Studio. Сведения о просмотре и фильтрации журналов из Android Studio см. в разделе Просмотр и запись журналов с помощью Logcat .

Обзор системы журналирования

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

  • main : хранит большинство журналов приложений.
  • system : хранит сообщения, исходящие из ОС Android.
  • crash : сохраняет журналы сбоев. Каждая запись журнала имеет приоритет, тег, идентифицирующий источник журнала, и фактическое сообщение журнала.

Основным интерфейсом C/C++ для системы журналирования является разделяемая библиотека liblog и ее заголовок <android/log.h> . Все средства ведения журнала, специфичные для языка (включая android.util.Log ), в конечном итоге вызывают функцию __android_log_write . По умолчанию он вызывает функцию __android_log_logd_logger , которая отправляет запись журнала в logd с помощью сокета. Начиная с уровня API 30, функцию журналирования можно изменить, вызвав __android_set_log_writer . Более подробная информация доступна в документации NDK .

Журналы, отображаемые adb logcat проходят четыре уровня фильтрации:

Фильтрация во время компиляции
В зависимости от настроек компиляции некоторые журналы могут быть полностью удалены из двоичного файла. Например, ProGuard можно настроить на удаление вызовов Log.d из кода Java.
Фильтрация свойств системы
liblog запрашивает набор системных свойств, чтобы определить минимальный уровень серьезности для отправки в logd . Если ваши журналы имеют тег MyApp , следующие свойства проверяются и должны содержать первую букву минимального уровня серьезности ( V , D , I , W , E или S для отключения всех журналов):
  • log.tag.MyApp
  • persist.log.tag.MyApp
  • log.tag
  • persist.log.tag
Фильтрация приложений
Если ни одно из свойств не установлено, liblog использует минимальный приоритет, установленный __android_log_set_minimum_priority . Настройка по умолчанию — INFO .
Фильтрация отображения
adb logcat поддерживает дополнительные фильтры, которые могут уменьшить количество журналов, отображаемых из logd . Дополнительные сведения см. в разделе о фильтрации вывода журнала .

Синтаксис командной строки

Чтобы запустить logcat через оболочку adb , обычно используется следующее:

[adb] shell logcat [<option>] ... [<filter-spec>] ...

Существует также сокращение adb logcat , но оно просто расширяется до adb shell logcat .

Параметры

logcat имеет много опций. Доступные параметры будут зависеть от версии ОС используемого вами устройства. Чтобы просмотреть справку по logcat для используемого вами устройства, выполните:

    adb logcat --help
    

Обратите внимание: поскольку logcat — это инструмент для разработчиков ОС, а также разработчиков приложений (предполагается, что вместо этого разработчики приложений будут использовать Android Studio), многие параметры можно использовать только с root .

Фильтрация вывода журнала

Тег сообщения журнала представляет собой короткую строку, указывающую системный компонент, из которого исходит сообщение. Например, «Вид» для системы просмотра.

Приоритет — это одно из следующих значений символов, упорядоченных от самого низкого к высшему:

    • V : Подробный (самый низкий приоритет).
    • D : Отладка
    • I : Информация
    • W : Внимание
    • E : Ошибка
    • F : Фатально
    • S : Тихий режим (высший приоритет, при котором ничего не печатается)
  • Чтобы получить список тегов, используемых в системе, с приоритетами, запустите logcat и просмотрите первые два столбца каждого сообщения, заданные как <priority>/<tag> .

    Ниже приведен пример краткого вывода logcat , полученного с помощью команды logcat -v brief output . Вывод показывает, что сообщение относится к уровню приоритета «I» и тегу «ActivityManager»:

    I/ActivityManager(  585): Starting activity: Intent { action=android.intent.action...}
    

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

    Выражение фильтра имеет следующий формат tag:priority ... , где tag указывает интересующий тег, а priority указывает минимальный уровень приоритета, который необходимо сообщить для этого тега. Сообщения для этого тега с указанным приоритетом или выше записываются в журнал. Укажите любое количество спецификаций tag:priority в одном выражении фильтра. Серия спецификаций разделяется пробелами.

    Ниже приведен пример выражения фильтра, подавляющего все сообщения журнала, за исключением тех, которые имеют тег «ActivityManager» с приоритетом «Info» или выше и тегом «MyApp» с приоритетом «Отладка» или выше:

    adb logcat ActivityManager:I MyApp:D *:S
    

    Последний элемент в предыдущем выражении, *:S , устанавливает для всех тегов уровень приоритета «тихий», что гарантирует отображение только сообщений журнала с «ActivityManager» и «MyApp». Использование *:S гарантирует, что вывод журнала будет ограничен фильтрами, которые вы явно указали. *:S позволяет вашим фильтрам служить списком разрешений для вывода журнала.

    Примечание. В некоторых оболочках символ « * » зарезервирован оболочкой. Если вы используете такую ​​оболочку, заключите выражение фильтра в кавычки: adb logcat "ActivityManager:I MyApp:D *:S"

    Следующее выражение фильтра отображает все сообщения журнала с уровнем приоритета «предупреждение» и выше для всех тегов:

    adb logcat *:W
    

    Если вы запускаете logcat со своего компьютера разработки, а не в удаленной оболочке adb , вы также можете установить выражение фильтра по умолчанию, экспортировав значение для переменной среды ANDROID_LOG_TAGS :

    export ANDROID_LOG_TAGS="ActivityManager:I MyApp:D *:S"
    

    Фильтр ANDROID_LOG_TAGS не экспортируется в экземпляр эмулятора/устройства, если вы запускаете logcat из удаленной оболочки или используете adb shell logcat .

    Формат вывода журнала управления

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

    • brief : отображает приоритет, тег и PID процесса, выдающего сообщение.
    • long : отображает все поля метаданных и отдельные сообщения с пустыми строками.
    • process : отображает только PID.
    • raw : отображает необработанное сообщение журнала без других полей метаданных.
    • tag : отображает только приоритет и тег.
    • thread: устаревший формат, который показывает приоритет, PID и TID потока, отправляющего сообщение.
    • threadtime (по умолчанию): отображает дату, время вызова, приоритет, тег, PID и TID потока, выдающего сообщение.
    • time : отображает дату, время вызова, приоритет, тег и PID процесса, выдающего сообщение.

    При запуске logcat укажите желаемый формат вывода, используя опцию -v :

    [adb] logcat [-v <format>]
    

    Вот пример, показывающий, как генерировать сообщения в формате вывода thread :

    adb logcat -v thread
    

    С опцией -v можно указать только один выходной формат. Однако вы можете указать столько модификаторов, сколько вам нужно, при условии, что они имеют смысл. logcat игнорирует модификаторы, которые не имеют смысла.

    Модификаторы формата

    Модификаторы формата изменяют вывод logcat . Чтобы указать модификатор формата, используйте опцию -v следующим образом:

    adb logcat -b all -v color -d
    

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

    • brief
    • long
    • process
    • raw
    • tag
    • thread
    • threadtime
    • time

    Чтобы отформатировать следующие данные модификатора, введите logcat -v --help в командной строке:

    • color : каждый уровень приоритета отображается разным цветом.
    • descriptive : показывает описания событий буфера журнала. Этот модификатор влияет только на сообщения буфера журнала событий и не влияет на другие недвоичные буферы. Описания событий берутся из базы данных тегов журнала событий.
    • epoch : отображает время в секундах, начиная с 1 января 1970 года.
    • monotonic : отображает время в секундах процессора, начиная с последней загрузки.
    • printable : гарантирует, что любое содержимое двоичного журнала будет экранировано.
    • uid : если это разрешено средствами управления доступом, отображает UID или Android ID зарегистрированного процесса.
    • usec : отображает время с точностью до микросекунд.
    • UTC : отображает время в формате UTC.
    • year : добавляет год к отображаемому времени.
    • zone : добавляет местный часовой пояс к отображаемому времени.

    Просмотр альтернативных буферов журнала

    Система журналирования Android хранит несколько циклических буферов для сообщений журнала, и не все сообщения журнала отправляются в циклический буфер по умолчанию. Чтобы просмотреть дополнительные сообщения журнала, запустите команду logcat с опцией -b , чтобы запросить просмотр альтернативного кольцевого буфера. Вы можете просмотреть любой из этих альтернативных буферов:

    • radio : просматривает буфер, содержащий сообщения, связанные с радио/телефонией.
    • events : Просматривает интерпретированные сообщения буфера событий двоичной системы.
    • main : просматривает основной буфер журнала (по умолчанию), который не содержит сообщений системы и журнала сбоев.
    • system : просмотр буфера системного журнала (по умолчанию).
    • crash : просмотр буфера журнала сбоев (по умолчанию).
    • all : Просматривает все буферы.
    • default : сообщает об main , system и crash буферах.

    Использование опции -b :

    [adb] logcat [-b <buffer>]
    

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

    adb logcat -b radio
    

    Чтобы указать несколько флагов -b для всех буферов, которые вы хотите распечатать, введите следующее:

    logcat -b main -b radio -b events
    

    Укажите один флаг -b со списком буферов, разделенных запятыми, например:

    logcat -b main,radio,events
    

    Вход из кода

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

    Например, используя следующий вызов:

    Котлин

    Log.i("MyActivity", "MyClass.getView() — get item number $position")
    

    Ява

    Log.i("MyActivity", "MyClass.getView() — get item number " + position);
    

    logcat выводит что-то похожее на следующее:

    I/MyActivity( 1557): MyClass.getView() — get item number 1