Tag log что это
Перейти к содержимому

Tag log что это

  • автор:

Tag log

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

Это в принципе стандартная практика, я сам обращаюсь к людям, которые в чем-то разбираются лучше меня, для освещения этих вопросов. В итоге в логах накапливается неплохой такой FAQ, который был бы полезен для многих других людей. Но принципы работы IM-клиентов стары и простановка тегов отсутствует. А полезное часто вязнет в сотнях лытдыбр-сообщений.

Сразу сохранять нужные диалоги получается редко. Поэтому предлагаю теговать подобные полезные сообщения самостоятельно, например, отправляя ключевое слово «!useful». Потом по поиску легко будет найти.

Смотрим шире: можно создать (а лучше взять уже привычный и готовый, скажем из набора своих тегов к блогу, почте или файлам) набор правильных тегов: !useful, !usability, !ppc, !private, !sql, !seo, !design, !idea, !cyberculture, !google, !socnet, etc. Будет небольшой спам собеседнику, но думаю он тоже оценит последующую возможность тегов и начнет использовать сам.

За 8 лет у меня логах аськи накопилось наверное тысячи раскрытий интересных вопросов. Но в этих мегабайтах логов закопаешься… Пришла бы мне эта идея в голову пораньше…

Может в каком-нибудь IM-клиенте это уже реализовано внутри?

Простая и очевидная замена android.util.Log

Однажды я писал один проект. Проект выдался большим и писал я его долго.
Там было все что только можно было запихнуть — и retrolambda/java8, и пара десятков
других библиотек (жадность заказчика до новых фич не знала границ, а потому
росло число зависимостей).

Но речь даже не об этом. Настало время делать релиз. И оказалось что в проекте
множество логов и неплохо бы их из релизной сборки убрать. Всем известный
способ с ProGuard не сработал с первого раза. С каждым новым «-keep»
приложение падало в каком-то новом месте. Так что ProGuard пришлось отключить
до лучших времен.

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

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

Совместимое API — залог простой миграции

Одна из причин почему я не стал использовать Timber — потому что мои пальцы
привыкли печатать Log.d. Свой класс я назвал тоже «Log», а методы сделал совместимыми с «android.util.Log».

Это значит, что если вы захотите соскочить со стандартного логгера — просто
замените импорты. Это можно сделать с помощью sed, или с помощью вашей любимой
IDE.

А в чем преимущество?

Ну вот несколько отрывков кода, показывающие основные фичи логгера:

// Весь ваш старый код останется работать как и прежде Log.d(tag, "X equals " + x); // Но теперь можно будет выводить несколько значений через запятую Log.d(tag, "X", x) 
// Можно будет не писать теги, по умолчанию они возьмутся из имени класса class Foo < public void foo() < Log.d("Hello"); // выведет 'D/Foo: Hello' >> // Разве только в классе будет свой атрибут "tag" (или "TAG") class Foo < private final static String TAG = "Bar"; public void foo() < Log.d("Hello"); // выведет 'D/Bar: Hello' Log.d(TAG, "Hello"); // выведет 'D/Bar: Hello', не 'D/Bar: Bar Hello' >> // Конечно, все это настаиваемо и атрибут тега может называться как угодно class Foo < static < Log.useTags(new String[]); > private final static String _TAG = "Bar"; . > 
// Можно выводить экспешены, для них будет напечатан стек-трейс Exception e = new Exception("foo"); Log.d("Something bad happened", someObject, "error:", e); // Длинные сообщения можно писать через точку Log .d("First") .d("Second") .d("Third line") // То с чего все начиналось - контроль за уровнем логирования Log.level(Log.I); Log.d("foo"); // ничего не выведет // Можно использовать форматные стоки, как в String.format() Log.useFormat(true); Log.d("X equals %d", x); // выведет 'X equals 42' // Если в первой строке нет процентов - будет использоваться вывод через запятую Log.d("Value of X", x); // выведет 'Value of X 42' // Длинные строки переносятся по '\n'. Непереносимые строки длиннее 4000 // символов будет переноситься по пробелам или пунктуации. Можно смело // выводить длинные JSON-ы или HTML Log.d("Hello\nworld"); // выведет 'D/SomeTag: Hello', затем 'D/SomeTag: world' // Логгер работает как в андроиде, так и в JVM. // В андроиде логирование ведется через стандартный логгер, в обычной джаве - // через System.out.println // Но все это можно настроить вручную Log.usePrinter(Log.SYSTEM.true).usePrinter(Log.ANDROID, false).d("hello"); // использовать System.out, в том числе и в андроиде // А еще можно использовать свои "принтеры", например для Crashlytics Log.usePrinter(mCrashlyricsPrinter, true); 

Уговорили, где взять?

В build.gradle библиотека подключается как обычно:

repositories < jcenter() // или mavenCentral() >dependencies

Вот так можно заменить импорты:

$ find -name "*.java" -type f -exec sed -i 's/import android.util.Log/import trikita.log.Log/g' <> \; 

Логгер под лицензией MIT, используйте на здоровье. Там один класс без
зависимостей, всего на 250 строк, так что проект ваш тяжелей/тормозней не станет.

Любые пожелания или багрепорты (особенно с патчами) приветствуются!

  • Потокобезопасность пришлось сделать в лоб, через synchronized. Померял скорость — практически не замедлилась, зато многострочные сообщения не разрываются если их печатать из разных потоков. Да и так спокойнее если вдруг принтер не многопоточный
  • Проверил бенчмарки — да, мой логгер медленнее чем android.util.Log за счет рефлексии. Однако он ничуть не медленнее Timber’а. Вообщем, если вы пишете меньше чем 10000 логов в секунду — проблем с производительностью не будет
  • Добавил приватный конструктор, ну и там по мелочам — где названия привел в порядок, где документацию

Logcat

LogCat

В Android SDK входит набор инструментов, предназначенных для отладки. Самый важный инструмент при отладке — это LogCat (очень красивое название, которое можно перевести как Логичный Кот). Он отображает сообщения логов (журнал логов), рассылаемые при помощи различных методов.

В студии версии Electric Eel обновили Logcat. Все старые примеры работают, но появились дополнительные возможности.

Рассмотрим на примере стандартное применение Logcat. Очень часто программисту нужно вывести куда-то промежуточные результаты, чтобы понять, почему программа не работает. Особо хитрые временно размещают на экране текстовую метку и выводят туда сообщение при помощи метода textView.setText(«Здесь был Васька»). Но есть способ лучше. В Android есть специальный класс android.util.Log для подобных случаев.

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

  • Log.e() — ошибки (error)
  • Log.w() — предупреждения (warning)
  • Log.i() — информация (info)
  • Log.d() — отладка (degub)
  • Log.v() — подробности (verbose)
  • Log.wtf() — очень серьёзная ошибка! (What a Terrible Failure!, работает начиная с Android 2.2)
  • Log.meow() — когда жрать дадут? (MEOW!) Недокументированный метод, используйте на свой страх и риск. Работает не на всех устройствах

В первом параметре метода используется строка, называемая тегом. Обычно принято объявлять глобальную статическую строковую переменную TAG в начале кода:

   private val TAG = "MyApp" 
private static final String TAG = "MyApp";

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

   private val TAG = this.javaClass.simpleName 
private static final String TAG = this.getClass().getSimpleName();

Далее уже в любом месте вашей программы вы вызываете нужный метод журналирования с этим тегом:

 Log.i(TAG, "Это моё сообщение для записи в журнале"); 

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

Напишем простой пример с кнопкой.

 package ru.alexanderklimov.flamingo import android.os.Bundle import android.util.Log import android.widget.Button import androidx.appcompat.app.AppCompatActivity class MainActivity : AppCompatActivity() < private val TAG = this.javaClass.simpleName override fun onCreate(savedInstanceState: Bundle?) < super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) val button: Button = findViewById(R.id.button) button.setOnClickListener < Log.i(TAG, "Кот нажал на кнопку") >> > 

Запускаем программу и в студии открываем вкладку Logcat:

Logcat

Вы увидите несколько строк с технической информацией.

 --------- beginning of system --------- beginning of main --------------- PROCESS STARTED (25918) for package ru.alexanderklimov.flamingo --------------- 2023-05-24 16:31:08.294 25918-25961 OpenGLRenderer . 

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

 2023-05-24 16:51:57.482 25918-25918 MainActivity ru.alexanderklimov.flamingo I Кот нажал на кнопку 

Обратите внимание, что по умолчанию в Logcat установлен фильтр package:mine . Это позволяет отсечь множество системных сообщений, которые вам не нужны. Вы можете удалить фильтр и увидеть все эти сообщения. Убедившись, что они вам действительно не нужны, верните фильтр обратно.

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

 package:mine level:info 

Для нашего примера особо ничего не изменилось. Дело в том, что категория info включает в себя все остальные категории. Фильтр level:warn будет показывать только категории Warning и Error.

Кроме показа сообщений о своём приложении через фильтр package:mine можно установить фильтры для других приложений: package:package-ID (указать идентификатор)

Если вы установили много тэгов, то посмотреть только нужные можно через фильтр tag:. Тогда вы не увидите лишние записи, которые были по умолчанию.

 package:mine tag:MainActivity 

Можно убрать лишние записи через знак минуса. Например, уберём тэг OpenGLRenderer:

 package:mine -tag:OpenGLRenderer 

Все логи имеют временную метку. Можно использовать фильтр age с указанием интервала.

  • age:30s — логи за последние 30 секунд
  • age:2m — логи за последние 2 минуты
  • age:1h — логи за последний час
  • age:2d — логи за 2 дня

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

History logcat

Слева в списке фильтров есть значок звёзды — вы можете поместить любимые фильтры в Избранное.

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

В левой части Logcat есть различные значки. Один из них отвечает за внешний вид журнала логов: можно выбрать вариант Standard View или Compact View. Либо вы можете настроить под себя, выбрав Modify Views, тогда у вас откроется диалоговое окно с настройками.

Можно создавать несколько вкладок Logcat, нажимая на значок +.

Далее идёт текст к старой версии Logcat. Возможны некоторые разночтения с новой версией, но в целом всё работает.

Полный вид сообщения выглядит следующим образом.

03-09 20:44:14.460 3851-3879 / ru.alexanderklimov.cat I/OpenGLRenderer : Initialized EGL, version 1.4

  • 03-09 20:44:14.460 Date/Time
  • 3851-3879 Process & Thread IDs
  • ru.alexanderklimov.cat Package name
  • I/OpenGLRenderer Tag
  • Initialized EGL, version 1.4 Message

Подобные длинные сообщения не всегда удобны для чтения. Вы можете убрать ненужные элементы. Для этого выберите значок LogCat Header в виде шестерёнки и уберите флажки у опций.

Logcat Header

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

Типы сообщений можно раскрасить разными цветами через настройки File | Settings | Editor | Colors Scheme | Android Logcat.

Для отслеживания сообщений с заданным текстом введите в поле поиска нужную строку и нажмите Enter.

Также активно используйте варианты из других выпадающих списков. Например, выбирайте свой пакет из второй колонки, а в последней выбирайте Show only selected application. Для более точной настройки используйте Edit Fiter Configuration.

LogCat

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

LogCat также можно запустить из командной строки:

adb logcat

Параметры командной строки смотрите в документации.

Быстрое отключение журналирования

Настоятельно рекомендуется удалять все вызовы LogCat в готовых приложениях. Если проект очень большой и вызовы журналирования разбросаны по всем местам кода, то ручное удаление (или комментирование) становится утомительным занятием. Многие разработчики используют следующую хитрость — создают обёртку вокруг вызова методов LogCat.

 public static final boolean isDebug = false; public final String TAG = "MyLogger"; public void MyLogger(String statement) < if (isDebug) < Log.v(TAG, statement); >> 

Теперь остаётся только присвоить нужное значение переменной isDebug перед созданием готового apk-файла для распространения.

Способ устарел. В 17-й версии Android Build Tools появился класс BuildConfig, содержащий статическое поле DEBUG. Можно проверить следующим образом:

 if (BuildConfig.DEBUG) < // Режим отладки, ведём логи >

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

 buildTypes < release < // Здесь настройки релиза buildConfigField "boolean", "USE_LOG", "false" >debug < buildConfigField "boolean", "USE_LOG", "true" >// «Релиз с логами» наследуем от обычного релиза releaseWithLog.initWith(buildTypes.release) releaseWithLog < buildConfigField "boolean", "USE_LOG", "true" >> 

В этом случае конфигурация releaseWithLog будет являться релизной сборкой с ведением логов. Естественно, в коде слегка поменяется проверка:

 if (BuildConfig.USE_LOG) < // Здесь используем логи >

LogCat на устройстве

Попался в сети пример для просмотра сообщений LogCat на устройстве. С примером не разбирался, оставлю здесь на память.

Разметка для элемента списка:

Добавляем разрешение в манифест:

 package ru.alexanderklimov.test; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.util.ArrayList; import java.util.List; import android.app.AlertDialog; import android.app.ListActivity; import android.content.Context; import android.graphics.Color; import android.os.AsyncTask; import android.os.Bundle; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.ArrayAdapter; import android.widget.ListView; import android.widget.TextView; public class TestActivity extends ListActivity < private LogStringadapter adapter = null; private ArrayListlogarray = null; private LogReaderTask logReaderTask = null; @Override public void onCreate(Bundle savedInstanceState) < super.onCreate(savedInstanceState); setContentView(R.layout.activity_test); logarray = new ArrayList(); adapter = new LogStringadapter(this, R.id.txtLogString, logarray); setListAdapter(adapter); logReaderTask = new LogReaderTask(); logReaderTask.execute(); > @Override protected void onDestroy() < logReaderTask.stopTask(); super.onDestroy(); >@Override protected void onListItemClick(ListView l, View v, int position, long id) < super.onListItemClick(l, v, position, id); final AlertDialog.Builder builder = new AlertDialog.Builder( TestActivity.this); String text = ((String) ((TextView) v).getText()); builder.setMessage(text); builder.show(); >private int getLogColor(String type) < int color = Color.BLUE; if (type.equals("D")) < color = Color.rgb(0, 0, 200); >else if (type.equals("W")) < color = Color.rgb(128, 0, 0); >else if (type.equals("E")) < color = Color.rgb(255, 0, 0); ; >else if (type.equals("I")) < color = Color.rgb(0, 128, 0); ; >return color; > private class LogStringadapter extends ArrayAdapter  < private Listobjects = null; public LogStringadapter(Context context, int textviewid, List objects) < super(context, textviewid, objects); this.objects = objects; >@Override public int getCount() < return ((null != objects) ? objects.size() : 0); >@Override public long getItemId(int position) < return position; >@Override public String getItem(int position) < return ((null != objects) ? objects.get(position) : null); >public View getView(int position, View convertView, ViewGroup parent) < View view = convertView; if (null == view) < LayoutInflater vi = (LayoutInflater) TestActivity.this .getSystemService(Context.LAYOUT_INFLATER_SERVICE); view = vi.inflate(R.layout.logitem, null); >String data = objects.get(position); if (null != data) < TextView textview = (TextView) view .findViewById(R.id.txtLogString); String type = data.substring(0, 1); String line = data.substring(2); textview.setText(line); textview.setTextColor(getLogColor(type)); >return view; > > private class LogReaderTask extends AsyncTask < private final String[] LOGCAT_CMD = new String[] < "logcat" >; private final int BUFFER_SIZE = 1024; private boolean isRunning = true; private Process logprocess = null; private BufferedReader reader = null; private String[] line = null; @Override protected Void doInBackground(Void. params) < try < logprocess = Runtime.getRuntime().exec(LOGCAT_CMD); >catch (IOException e) < e.printStackTrace(); isRunning = false; >try < reader = new BufferedReader(new InputStreamReader( logprocess.getInputStream()), BUFFER_SIZE); >catch (IllegalArgumentException e) < e.printStackTrace(); isRunning = false; >line = new String[1]; try < while (isRunning) < line[0] = reader.readLine(); publishProgress(line); >> catch (IOException e) < e.printStackTrace(); isRunning = false; >return null; > @Override protected void onCancelled() < super.onCancelled(); >@Override protected void onPreExecute() < super.onPreExecute(); >@Override protected void onPostExecute(Void result) < super.onPostExecute(result); >@Override protected void onProgressUpdate(String. values) < super.onProgressUpdate(values); adapter.add(values[0]); >public void stopTask() < isRunning = false; logprocess.destroy(); >> > 

Журнал отладки Android

Очень часто разработчики для отладки своих приложений используют вызовы к Console.WriteLine . Однако на мобильной платформе, такой как Android, консоль отсутствует. На устройствах Android доступен журнал, который можно использовать при создании приложений. Иногда его называют logcat из-за команды, которую нужно ввести для его получения. Для просмотра данных журнала используйте инструмент Журнал отладки.

Общие сведения о журнале отладки Android

Инструмент Журнал отладки позволяет просматривать выходные данные журнала при отладке приложения с помощью Visual Studio. Журнал отладки поддерживает следующие устройства:

  • физические телефоны, планшеты и переносные устройства Android;
  • виртуальные устройства с Android, работающие в Android Emulator.

Инструмент Журнал отладки не работает с Xamarin Live Player.

Журнал отладки не отображает сообщения журнала, созданные во время автономной работы приложения на устройстве (т. е. пока устройство не подключено к Visual Studio).

Получение доступа к журналу отладки из Visual Studio

  • Visual Studio
  • Visual Studio для Mac

Чтобы открыть инструмент Журнал устройств, щелкните значок Журнал устройств (logcat) на панели инструментов:

Расположение средства

Кроме того, можно запустить инструмент Журнал устройств, последовательно открыв такие элементы меню:

  • Просмотр > журнала других устройств Windows >
  • Средства > для журнала устройств Android >

На следующем снимке экрана показаны разные элементы окна Инструмент для отладки:

Части окна средства отладки

  • Селектор устройств — выбирает физическое устройство или работающий эмулятор для мониторинга.
  • Записи журнала — таблица сообщений журнала из logcat.
  • Очистить записи журнала — удаляет все текущие записи журнала из таблицы.
  • Воспроизведение и приостановка — переключение между обновлением или приостановкой отображения новых записей журнала.
  • Stop — останавливает отображение новых записей журнала.
  • Поле поиска — введите строки поиска в этом поле, чтобы отфильтровать подмножество записей журнала.

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

Расположение селектора устройств

После выбора устройства средство «Журнал устройств» автоматически добавляет записи журнала из работающего приложения. Эти записи журнала отображаются в таблице записей журнала. При переключении между устройствами ведение журнала устройств останавливается и запускается. Обратите внимание, что проект Android следует загрузить до того, как любые устройства будут отображаться в селекторе устройства. Если устройство не отображается в селекторе устройства, убедитесь, что оно доступно в раскрывающемся меню Visual Studio на устройстве рядом с кнопкой Пуск.

Чтобы открыть журнал устройств, щелкните Просмотреть > журнал устройств панели>:

Расположение пункта меню

На следующем снимке экрана показаны разные элементы окна Инструмент для отладки:

Возможности окна средства отладки

  • Селектор устройств — выбирает физическое устройство или работающий эмулятор для мониторинга.
  • Записи журнала — таблица сообщений журнала из logcat.
  • Очистить записи журнала — удаляет все текущие записи журнала из таблицы.
  • Поле поиска — введите строки поиска в этом поле, чтобы отфильтровать подмножество записей журнала.
  • Показать сообщения — переключает отображение информационных сообщений.
  • Показывать предупреждения — переключает отображение предупреждающих сообщений (предупреждающие сообщения отображаются желтым цветом).
  • Показать ошибки — переключает отображение сообщений об ошибках (предупреждающие сообщения отображаются красным цветом).
  • Повторное подключение — повторно подключается к устройству и обновляет отображение записи журнала.
  • Добавить маркер — вставляет сообщение маркера (например — Marker N — , ) после последней записи журнала, где N — это счетчик, который начинается с 1 и увеличивается на 1 при добавлении новых маркеров.

Когда отображается окно инструмента «Журнал отладки», используйте раскрывающееся меню устройства, чтобы выбрать устройство Android для мониторинга:

Расположение селектора устройства

После выбора устройства средство «Журнал устройств» автоматически добавляет записи журнала из работающего приложения. Эти записи журнала отображаются в таблице записей журнала. При переключении между устройствами ведение журнала устройств останавливается и запускается. Обратите внимание, что проект Android следует загрузить до того, как любые устройства будут отображаться в селекторе устройства. Если устройство не отображается в селекторе устройства, убедитесь, что оно доступно в раскрывающемся меню Visual Studio на устройстве рядом с кнопкой Пуск.

Доступ из командной строки

  • Visual Studio
  • Visual Studio для Mac

Кроме того, просмотреть журнал отладки можно с помощью командной строки. Откройте окно командной строки и перейдите в папку android SDK platform-tools (как правило, папка sdk platform-tools находится в папке C:\Program Files (x86)\Android\android-sdk\platform-tools).

Если подключено только одно устройство (физическое устройство или эмулятор), для просмотра журнала можно просто ввести следующую команду:

$ adb logcat 

Кроме того, просмотреть журнал отладки можно с помощью командной строки. Откройте окно терминала и перейдите в папку platform-tools пакета SDK для Android (как правило, эта папка хранится в расположении /Users/username/Library/Developer/Xamarin/android-sdk-macosx/platform-tools).

Если подключено только одно устройство (физическое устройство или эмулятор), для просмотра журнала можно просто ввести следующую команду:

$ ./adb logcat 

Если подключено несколько устройств, необходимо явно указать нужное устройство. Например, при выполнении команды adb -d logcat отображается только журнал подключенного физического устройства, а при выполнении команды adb -e logcat — только журнал запущенного эмулятора.

Чтобы узнать дополнительные команды, введите adb и прочитайте сообщения справки.

Запись в журнал отладки

Записывать сообщения в журнал отладки можно с помощью методов класса Android.Util.Log. Пример:

string tag = "myapp"; Log.Info (tag, "this is an info message"); Log.Warn (tag, "this is a warning message"); Log.Error (tag, "this is an error message"); 

Вы увидите приблизительно следующее:

I/myapp (11103): this is an info message W/myapp (11103): this is a warning message E/myapp (11103): this is an error message 

Можно также использовать для Console.WriteLine записи в журнал отладки — эти сообщения отображаются в logcat с немного другим форматом вывода (этот метод особенно полезен при отладке приложений Xamarin.Forms на Android):

System.Console.WriteLine ("DEBUG - Button Clicked!"); 

Это выведет в logcat примерно следующее:

Info (19543) / mono-stdout: DEBUG - Button Clicked! 

Интересующие сообщения

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

I/ActivityManager(12944): Starting: Intent < act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] flg=0x10200000 cmp=GcTest.GcTest/gctest.Activity1 >from pid 24175 

В частности, найдите строку, которая соответствует регулярному выражению, также содержащему имя пакета приложения:

^I.*ActivityManager.*Starting: Intent 

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

Обратите внимание, что каждое сообщение содержит идентификатор процесса (pid) для процесса, создающего сообщение. В указанном выше сообщении ActivityManager сообщение было создано процессом 12944 . Чтобы определить, какой процесс является процессом отлаживаемого приложения, найдите сообщение mono.MonoRuntimeProvider:

I/ActivityThread( 602): Pub TouchTest.TouchTest.__mono_init__: mono.MonoRuntimeProvider 

Это сообщение отправляется запущенным процессом. Все последующие сообщения, содержащие этот pid, отправляются этим же процессом.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *