Pull to refresh

SwiftyBeaver руководство для iOS: платформа логирования для Swift

Reading time12 min
Views5.1K
Original author: Ted Bendixson
Ошибки бывают разных форм и размеров. Некоторые ошибки милые и пушистые и их легко исправить, потому что вы можете запустить ваше приложение и пойти прямо к тому месту где происходит ошибка. Если вы счастливчик, Xcode покажет вам какая строка привела к падению вашего приложения.

Другие ошибки более зловещие. Они таятся в фоне и случаются когда вы менее всего этого ожидаете. Они ужасы ночных кошмаров и рекламных роликов Listerine.

В этом уроке вы обнаружите секретное оружие, с которым сможете разобраться с этим зловещими ошибками, которые притаились в фоне. При должном использовании это оружие похоже на свет фонарика в самых глубоких и темных расщелинах вашего приложения. У этих жутких ошибок не будет ни единого шанса.

Это оружие — SwiftyBeaver, основанная на Swift система логирования для iOS и macOS.

В этом руководстве вы узнаете как отлаживать ваше приложения используя SwiftyBeaver и получите следующие полезные умения на этом пути:

  • Когда SwiftyBeaver логирование лучше чем print() и NSLog()
  • Как получить доступ к журналам SwiftyBeaver в Crypto Cloud
  • Как использовать уровни логирования для различных типов сообщений журнала
  • Как фильтровать записи, чтобы облегчить поиск ошибок

Примечание: перед началом урока вы должны быть знакомы с Cocoapods и фреймворком CoreLocation. Сначала ознакомьтесь с этими руководствами чтобы получить необходимые умения.

Начало


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

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

Это приложение названо Ten PM (Вы знаете где ваши дети?).
Откройте TenPM.xcworkspace и посмотрите проект. Теперь откройте Main.storyboard и вы увидете два view controller'а внутри navigation controller'а:


View controller слева — это тот, который родители могут использовать, чтобы сказать приложению где находится «дом» а также задать максимальное расстояние, на которое дети могут отходить. Класс — TrackingSetupViewController, который запрашивает доступ к службам геолокации и сохраняет введенное расстояние для ограничения расстояния.

View controller справа — это тот, который будут использовать дети. Он отображает карту с зеленым кругом представляющим безопасную зону. Он также содержит блок текста ниже, чтобы сообщим им, находятся ли они в настоящее время в безопасной зоне или нет. Класс — TrackingViewController, в котором используется MKMapView отображающий допустимую для детей территорию.

И здесь еще несколько строк на заметку:

  • LocationTracker.swift: выступает в роли делегата CLLocationManager. Здесь обрабатываются обновления местоположения и изменения разрешений для служб геолокации.
  • ParentProfile.swift: сохраняет важные данные пользователя в NSUserDefaults. Эти данные включают в себя местоположение дома и расстояние, на которое их дети могут отходить от дома.

Используем начальное приложение


Запустите предложение на iOS симуляторе. Вы увидете view controller который представлен классом TrackingSetupViewController:


Перед тем как настроить отслеживание, вы должны быть уверены, что симулятор предоставляет данные о начальном местоположении. Чтобы сделать это выберете симулятор, затем на панели выберите Debug\Location\Apple.


Нажмите на кнопку SETUP TRACKING и приложение запросит разрешение чтобы начать сбор данных о местоположении. Поскольку этот экран для родителей там есть одно лишнее окно для подтверждения, что вы родитель и находитесь дома. Выберите Yes и затем Allow. Один раз приложение определит ваше местоположение и сохранит его как дом, чтобы использовать как центр безопасной для детей зоны.

Сейчас введите 1 в текстовое поле ниже как безопасное расстояние от дома. Это означает, что вы не хотите в дальнейшем быть дальше чем 1 километр от симулированной локации Apple.


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

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

Теперь когда все настроено, самое время притвориться, что сейчас 2011 год, вы получили прототип iPhone 4 и отправляетесь на прогулку. Давайте симулируем новое местоположение, вне безопасной зоны, в том месте где вы назначили встречу с репортером Gawker.

В меню iOS Simulator снова пройдите в Debug\Location, но в этот раз выберите Custom Location. Введите 37.3393 как широту и -122.0426 как долготу после чего нажмите OK.


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

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

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

Установка SwiftyBeaver


Для начала установим SwiftyBeaver используя Cocoapods. Найдите корневую директорию проекта и найдите там Podfile. Откройте его в редакторе, который для вас наиболее удобен и добавьте следующую строку под строчкой # Pods for TenPM:

pod 'SwiftyBeaver'

Откройте Terminal, перейдите в директорию с эти Podfile и введите следующую команду:
pod install

После минуты или может чуть больше установка SwiftyBeaver в ваш проект будет завершена. Теперь откройте AppDelegate.swift и добавьте следующую строку в подходящем месте в верхней части файла:

import SwiftyBeaver

Скомпилируйте этот проект и вы увидете, что SwiftyBeaver теперь доступен в проекте потому что он был успешно скомилирован.


Примечание: это руководство по установке работает с Cocoapods и Swift 3. Более подробную инструкцию по установке вы можете найти на странице репозитория проекта SwiftyBeaver на GitHub.


Написание ваших первых логов со SwiftyBeaver


Фух. Вы готовы написать немного кода?

Загляните в AppDelegate.swift снова. Это место где вы сейчас настроите логирование для SwiftyBeaver. Вы заметили заготовку метод в стартовом проекте?

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

let console = ConsoleDestination()
SwiftyBeaver.addDestination(console)

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

ConsoleDestination() создает Console Destination, который вы добавили как активный destination для SwiftyBeaver.

В метод application(_:didFinishLaunchingWithOptions:) добавьте следущую строку кода, после вызова метода setupSwiftyBeaverLogging():

SwiftyBeaver.info("Hello SwiftyBeaver Logging!")

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

Запустите Ten PM снова. Проверьте консоль когда приложение запустится и вы увидете запись:
12:06:05.402 INFO AppDelegate.application():36 — Hello SwiftyBeaver Logging!

Круто! Вы ведете логирование в консоли с помощью SwiftyBeaver. Изобращение сердца относится к уровню логов, которые разъяснены ниже.

Краткое объяснение уровней логов


Я уверен, что на этом этапе вам интересно почему SwiftyBeaver заставляет использовать метод с именем info() вместо более понятных и логичных имен таких как log() или print().

Это связано с тем, что называется Log Levels.

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

SwiftyBeaver придерживается договоренностей и использует эти 5 уровней логов:

  1. Verbose: наименьший уровень приоритета. Используйте их для контекстной информации.
  2. Debug: используйте этот уровень для отображения переменных или иных результатов, которые помогут вам исправить ошибку или решить проблему.
  3. Info: обычно используется для информации полезной в более общем контексте поддержки. Другими словами, информация полезная для не-разработчиков ищучающие проблемы.
  4. Warning: используйте этот уровень когда достигаете состояния, которое не обязательно станет причиной проблемы, но решительно ведет приложение в этом направлении.
  5. Error: самый сериезный и высокий приоритет логов. Используйте его только тогда, когда ваше приложение вызывало серьезную ошибку.

Как записывать разные уровни логов со SwiftyBeaver


Также как вы использовали метод info() для логирования на уровне info, вы можете использовать четыре других метода: verbose(), debug(), warning(), и error() для логирования на остальных четырех уровнях.

Попробуйте. Вернитесь назад к методу application(_:didFinishLaunchingWithOptions:) и замените вызов info() на следующим кодом:

SwiftyBeaver.debug("Look ma! I am logging to the DEBUG level.")

Теперь запустите ваше приложение. Вы должны увидеть другой цвет иконки сердца и другое сообщение на уровне debug.

14:48:14.155 DEBUG AppDelegate.application():36 — Look ma! I am logging to the DEBUG level.

Обратите внимание, что цвет иконки сменился на зеленый, чтобы обозначить debug уровень логов. Это одна из причин, почему SwiftyBeaver лучше, чем print() и NSLog(). Вы можете быстро просмотреть логи и найти сообщения на уровне, который вас интересует.

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

Настройка SwiftyBeaver Crypto Cloud


Одна из крутейших особенностей SwiftyBeaver это возможность ведения логов напрямую в облаке. SwiftyBeaver имеется приложение для macOS, которое позволяет просматривать логи в реальном времени. Если вы когда-нибудь интересовались что же происходит в вашем приложении установленном на тысячи устройств, то теперь вы можете это знать.

Загрузите приложение SwiftyBeaver для Mac. Откройте его и заполните форму, чтобы создать аккаунт.


Далее вы будете перенаправлены напрямую в окно сохранения файла. Это немного странно, потому что они не сообщают для чего этот файл.

Назовите этот файл TenPMLogs, выберите любую локацию по своему усмотрению и нажмите Save.


Файл, которые в создали хранит логи для одного приложения, по этой причине вы и назвали его TenPMLogs. Когда вы открываете этот файл с помощью приложения SwiftyBeaver Mac App вы можете увидеть логи, связанные с приложением Ten PM. После сохранения файла вам будет предоставлен выбор. Вы можете зарегистрировать новое приложение или просмотреть логи из ранее зарегистрированного приложения. Вы продолжите на вкладке New App.


Кликните по кнопке Generate New App Credentials. Вы должны увидеть следующий экран, показывающий сгенерированные идентификатор и ключи для вашего приложения:


Теперь пора добавить еще один destination для логов используя только что созданные учетные данные безопасности Crypto Cloud. Оставьте это окно открытым и вернитесь к методу setupSwiftyBeaverLogging() в AppDelegate.swift.

Добавьте эти строки в низ этого метода, заменяя строки на соответствующие значение из приложения SwiftyBeaver Mac App:

let platform = SBPlatformDestination(appID: "Enter App ID Here",
                                     appSecret: "Enter App Secret Here",
                                     encryptionKey: "Enter Encryption Key Here")

SwiftyBeaver.addDestination(platform)

Вернитесь в приложение SwiftyBeaver Mac App и кликнките по кнопке Connect. Теперь запустите приложение Ten PM.

Примечание: если вы сглупили как и я и нажали кнопку Connect до того как скопировали учетные данные в ваше приложение, вы можете кликнуть по кнопке настроек (шестеренка) в приложении SwiftyBeaver Mac App, чтобы посмотреть их после подключения.


Теперь проверьте это! Ваши логи появляются в приложении SwiftyBeaver Mac App. Если вы не видите записи сразу же, то не волнуйтесь. Иногда это занимает несколько минут прежде чем записи в журнале попадут в облако. В конечном итоге они все равно появятся. SwiftyBeaver также автоматически предоставляет одночасовое хранение для ваших логов если вы не перешли на платный аккаунт. Для большинства задач отладки это не будет проблемой. Просто стоит это отметить в случае если вы задумываетесь почему ваши более старые логи больше не видны.

Фильтрация логов по уровню логирования, избранным записям и минимальным уровням логирования


По настоящему классная вещь в SwiftyBeaver Mac App это возможность фильтровать логи по уровню логирования. Это значительно упрощает процесс копания в логах, чтобы найти причину критической ошибки.

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

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

Фильтрация по минимальному уровню логирования


Это еще одна особенность, которую вы действительно полюбите. SwiftyBeaver позволяет вам установить минимальный уровень для заданного destination. Если вы хотите использовать ваш Crypto Cloud аккаунт для серьезных предупреждений и ошибок вы можеет это сделать.

Для начала замените текущий код логирования в applicationDidFinishLaunching() на следующий:

SwiftyBeaver.verbose("Watch me bloviate. I'm definitely not important enough for the cloud.")
    
SwiftyBeaver.debug("I am more important, but the cloud still doesn't care.")
    
SwiftyBeaver.info("Why doesn't the crypto cloud love me?")
    
SwiftyBeaver.warning("I am serious enough for you to see!")
    
SwiftyBeaver.error("Of course I'm going to show up in your console. You need to handle this.")

Сейчас вы логируете сообщению на каждом уровне. Запустите приложение и вы должны видеть как все эти записи попадают в Crypto Cloud.


В методе setupSwiftyBeaverLogging() добавьте следующее перед тем как добавляете эту платформу в destination:

platform.minLevel = .warning

Запустите приложение снова. Посмотрите на новый вид вашей консоли Crypto Cloud.


Вы должны видеть только предупреждения и ошибки за последнее время. Никаких других записей не попадет в Crypto Cloud. Вы по прежнему видите все в консоли Xcode!

Примечание: Вы можете задать минимальный уровень для любого типа логирования (destination) в SwiftyBeaver. Вы можете создать несколько Crypto Cloud журналов для различных уровней логирования. SwiftyBeaver имеет большой простор для разных способов логирования.

Исправление труднодоступных ошибок


Было весело поговорить о логировани в Crypto Cloud, но у вас есть некоторые зловещие ошибки, которые вам нужно исправить. Ну или как минимум у вас есть зловещие ошибки, которые вы намерено смоделируете и затем исправите их.

Начните с очистки всех ранних записей. Удалите все логирование из application(_:didFinishLaunchingWithOptions:). Также удалите установку значения для platform.minLevel чтобы по умолчанию отображались все записи. Для этого теста вам нужно будет видеть все записи в логах.

Моделирование ошибки


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

Откройте LocationTracker.swift и найдите там метод locationManager(_:didUpdateLocations:). Вставьте туда следующий код после объявления двух guard значений в верхней части метода:

let bug = true
        
if bug == true {
  return
}

Это довольно глупо, но здесь выпритворяетесь что где-то в LocationTracker есть ошибка, которая препятствует отслеживанию местоположения пользователя. Этот код здесь предотвращает уведомления о том, что пользователь вошел или покинул безопасную зону. Когда «ошибка» «отключена» этот код будет работать нормально.

Запустите приложение, чтобы убедиться в том, что «ошибка» есть.


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

Отслеживание ошибки с помощью SwiftyBeaver


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

Для начала импортируйте SwiftyBeaver в верхней части LocationTracker:

import SwiftyBeaver

Далее добавьте запись вверху метода locationManager(_:didUpdateLocations:):

SwiftyBeaver.info("Got to the didUpdateLocations() method")

Теперь добавьте несколько строк внизу и вставьте эту строку прямо после объявления константы bug:

SwiftyBeaver.debug("The value of bug is: \(bug)")

Далее добавьте информацию когда мы проверяем значение этой константы, но перед return:

SwiftyBeaver.error("There's definitely a bug... Aborting.")

И наконец, добавьте запись в конце метода locationManager(_:didUpdateLocations:):

SwiftyBeaver.info("Got to the end the didUpdateLocations method")

Этой информации должно быть достаточно, чтобы начать вычислиение что же происходит в вашем коде. Вот как должно выглядеть все содержимое метода locationManager(_:didUpdateLocations:):

SwiftyBeaver.info("Got to the didUpdateLocations() method")

guard let homeLocation = ParentProfile.homeLocation else {
  ParentProfile.homeLocation = locations.first
  return
}

guard let safeDistanceFromHome = ParentProfile.safeDistanceFromHome else {
  return
}

let bug = true
SwiftyBeaver.debug("The value of bug is: \(bug)")

if bug == true {
  SwiftyBeaver.error("There's definitely a bug... Aborting.")
  return
}

for location in locations {
  let distanceFromHome = location.distance(from: homeLocation)
  
  if distanceFromHome > safeDistanceFromHome {
    NotificationCenter.default.post(name: TenPMNotifications.UnsafeDistanceNotification, object: nil)
  } else {
    NotificationCenter.default.post(name: TenPMNotifications.SafeDistanceNotification, object: nil)
  }
}
SwiftyBeaver.info("Got to the end the didUpdateLocations method")

В симуляторе установите местположение в Apple также как делали это ранее. Теперь запустите приложение. Не смотря на то, что сейчас вам доступны логи в консоли Xcode проигнорируйте их и представьте, что вы отслеживаете записи в Crypto Cloud от удаленного пользователя.

Введите безопасное расстояние в 1 километр и нажмите NEXT. После загрузки карты смените ваше местоположение на широту 37.3397 и долготу -122.0426 через особое местоположение.

И снова вы вышли за пределы вашей безопасной зоны без обновления текста.


Вы должны заметить следующие записи, повторяющиеся в SwiftyBeaver Crypto Cloud после того, как установите фильтр в ALL:


Воу, это действительно полезно! Если вы вернетесь к своему коду в классе LocationTracker то сможете сопоставить это с логами и вы увидете как далеко проходит выполнение вашего кода прежде чем оно остановится. Здесь это явно в if bug == true где была запись об ошибке была выведена.

Чтобы «исправить» эту «ошибку» просто установите константу bug в значение false где она объявляется в методе locationManager(_:didUpdateLocations:):

let bug = false

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

Также вы должны видеть следующие записи в вашей Crypto Cloud консоли.


Это выглядит так как будто приложение миновало ошибку и снова успешно реагирует на изменения местоположения. Вы успешно исправили эту ошибку!

Куда дальше?


Вы можете найти завершенный проект к этому уроку здесь. Также ознакомьтесь с файловым логированием с помощью SwiftyBeaver. Если у вас есть iPhone и вы хотите быть на 100% увереным, что получите все свои записи (даже если нет Интернет-подключения). Для более интересных случаев ознакомьтесь с форматированием записей.
Tags:
Hubs:
Total votes 5: ↑0 and ↓5-5
Comments0

Articles