Jump to content

Сборка и анализ логов для iOS с помощью утилиты Console


Viktor Akselrod

6,016 views

Здравствуйте.
В этой статье мы поговорим об отладке приложений на iOS с помощью логирования (часть материала будет актуальна и для Android). 

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

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

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

Источники логов.

Источником логов может быть как библиотека FGX Native, операционная система, так и само приложение (сообщения отправленные непосредственно разработчиком). На первые два варианта разработчик особо не может повлиять, поэтому более подробно остановимся на третьем варианте.

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

Основным методом класса является метод Log позволяющий отправить строку с указанным уровнем лога.

    /// <summary>Выводит в системный лог сообщение <c>AMessage</c> типа <c>ALogType</c>.</summary>
    class procedure Log(const ALevel: TfgLogLevel; const AMessage: string);

Уровни лога определяют степень важности того или иного события.

  /// <summary>Уровень логирования.</summary>
  TfgLogLevel = (Trace, Debug, Info, Warning, Error, Fatal);

Вы можете определить минимальный уровень лога с помощью свойства MinimumLevel, чтобы уменьшить количество выводимых в лог сообщений

    /// <summary>
    ///   Указывает минимальный уровень лога, начиная с которого сообщение будет выводиться в системный лог.
    ///   Порядок следования уровней: Debug, Info, Warning, Error, Fatal. Debug - самый низкий.
    /// </summary>
    /// <remarks>
    ///   Для <c>DEBUG</c> конфигурации выводятся все типы сообщений по умолчанию. Для <c>RELEASE</c> сообщений выше
    ///   <c>Info</c>. Если вы хотите видеть в релизной сборке вашего приложения и отладочные сообщения, то задайте
    ///   значение <c>TfgLogLevel.Debug</c> в это свойство. Данная настройка распространяется только на этот класс. На
    ///   логирование через сервис <c>IFGXLoggerService</c> она не действует.
    /// </remarks>
    class property MinimumLevel: TfgLogLevel read FMinimumLogLevel write FMinimumLogLevel;

Для удобства у класса TfgLog есть набор одноименных методов, соответствующих каждому уровню лога. Например:

    /// <summary>
    ///   Выводит в системный лог низкоуровневое отладочное сообщение <c>AMessage</c> для выполнения трассировки.
    /// </summary>
    class procedure Trace(const AMessage: string); overload;
    /// <summary>Выводит в системный лог отладочное сообщение <c>AMessage</c>.</summary>
    class procedure Debug(const AMessage: string); overload;

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

    /// <summary>
    ///   Выводит в системный лог низкоуровневое отладочное сообщение <c>AMessage</c> с поддержкой форматирования <c>System.Format</c>.
    /// </summary>
    class procedure Trace(const AFormat: string; const Args: array of const); overload;
    /// <summary>
    ///   Выводит в системный лог отладочное сообщение <c>AMessage</c> с поддержкой форматирования <c>System.Format</c>.
    /// </summary>
    class procedure Debug(const AFormat: string; const Args: array of const); overload;


Сборка и просмотр логов.

Для просмотра логов с iOS используется утилита, работающая на компьютере под управлением macOS под названием Console.
Для просмотра логов с Android используется утилита работающая на компьютере под управлением Windows под названием logcat.
Частично логирование в контексте Android было затронуто ранее в Уроке 1 «Настройка окружения, Hello World приложение и логирование».
В данной статье мы сосредоточимся на утилите Console.

Важно! Подразумевается, что вы имеете настроенную связку: компьютер под управлением macOS к которому подключено устройство с iOS

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

uses
  System.SysUtils, FGX.Application, FGX.Dialogs, FGX.Log;

procedure TFormMain.fgButton1Tap(Sender: TObject);
begin
  TfgLog.Debug('Hello from TfgLog.Debug');
end;

procedure TFormMain.fgButton2Tap(Sender: TObject);
begin
  TfgLog.Info('Hello from TfgLog.Info');
end;

Теперь перейдем непосредственно к утилите сбора и просмотра логов.
Запустите утилиту Console которая находится в Launchpad -> Other.

tg_image_3706212814.jpeg

 

Главное окно состоит из меню навигации в левой части (1), тулбара с органами управления вверху (2) и списка логов, который занимают остальную клиентскую область окна (3).

tg_image_133399642.jpeg

 

Теперь выбираем в меню навигации слева устройство из списка Devices с которого мы хотим получать логи. В нашем случае это устройство с именем IPhone.

tg_image_196408901.jpg

 

Теперь запускаем сбор логов с помощью кнопки тулбара Start или кликнув по ссылке Start streaming находящейся в центре списка логов.

tg_image_133399641.jpg

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

tg_image_196408903.jpg

 

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

tg_image_4251286926.jpeg

Теперь запустим наше тестовое приложение и последовательно нажмем обе кнопки.

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

Важно! Фильтрация осуществляется без учета регистра.

Есть несколько способов, как можно отобразить только те строки, которые относятся к нашему приложению. Самый простой вариант - отфильтровать по имени процесса. Вводим фразу TestLogging в окно Search и нажимаем клавишу Enter на клавиатуре. По-умолчанию создастся фильтр с типом Any и способом сравнения Containts. Теперь изменим тип фильтра с Any на Process, a Containts на Equal, что означает, что в списке логов останутся только те строки, текст которых в колоноке равен  TestLogging

tg_image_1332426471.jpg

На скриншоте видно, как строки переданные самой библиотекой FGX Native, так и те, которые были отправлены после нажатия на кнопки (отмечены стрелками). Теперь вы можете изучать собранную информацию просматривая сообщения. При необходимости вы можете сохранить выделенные строки в буфер обмена, либо передать их в другое приложение к помощью кнопки тулбара Share.

 

Логирование - мощный инструмент, который может пригодиться в самых трудных и запутанных ситуациях при поиске ошибок. 

Спасибо за внимание и удачной отладки!

 

  • Like 10

0 Comments


Recommended Comments

There are no comments to display.

Guest
Add a comment...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

  • Recently Browsing   0 members

    • No registered users viewing this page.
×
×
  • Create New...