Просмотр сообщений журнала в Консоли на Mac

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

- В приложении «Консоль»
на Mac в списке устройств слева выберите устройство, для которого Вы хотите просмотреть сообщения журнала (например, Mac, iPhone, iPad, Apple Watch или Apple TV). Если список устройств не отображается, нажмите кнопку «Боковая панель»
на панели «Избранное». - Нажмите «Начать» в панели инструментов. В окне появятся сообщения журнала, относящиеся к выбранному устройству. Тип журнального сообщения обозначается точкой в столбце «Тип».
- Красная точка: сбои в работе.
- Желтая точка: ошибки.
- Темно-серая точка: журнальные сообщения, связанные с отладкой.
- Светло-серая точка: информационные журнальные сообщения.
Примечание. Если точки в столбце «Тип» нет, значит, сообщение журнала относится к типу «По умолчанию».

- Как увидеть журнальное сообщение целиком в столбце «Сообщения». Нажмите журнальное сообщение и нажмите стрелку вправо или выберите «Вид» > «Развернуть выбранную строку». Чтобы снова сократить сообщение до одной строки, нажмите стрелку влево или выберите «Вид» > «Свернуть выбранную строку».
- Просмотр полных журнальных сообщений. Нажмите «Подробнее» в сведениях о журнальном сообщении в нижней половине окна Консоли. Если сведения о журнальном сообщении не отображаются, нажмите кнопку «Информация» в панели инструментов (или воспользуйтесь панелью Touch Bar) или выберите «Вид» > «Показать панель свойств». Чтобы отображалось меньше сведений, нажмите «Скрыть».
- Поиск конкретных журнальных сообщений в текущей информации. Нажмите журнальное сообщение и нажмите Command-F. См. Поиск текста в сообщениях журнала и отчетах.
Просматривая журнальные сообщения, можно перемещать столбцы и менять их перечень, находить последние записи об активности, применять сохраненные поисковые запросы. См. Настройка окна журнала.
Передача данных анализа, диагностики и использования в компанию Apple
Компания Apple просит клиентов помочь улучшить iOS путем периодического предоставления ей данных анализа, диагностики и использования. Apple собирает эти сведения анонимно.
ОС iOS 10 и более поздней версии

Если на вашем устройстве установлена ОС iOS 10.3 или более поздней версии, перейдите в меню «Настройки» > «Конфиденциальность», прокрутите вниз и нажмите «Аналитика» или «Аналитика и улучшения». Затем нажмите «Делиться Анализом iPhone, Watch». Если на вашем устройстве установлена ОС iOS 10–10.2, перейдите в меню «Настройки» > «Конфиденциальность» > «Диагностика и использование» и выберите вариант «Отправлять автоматически» или «Не отправлять». Узнайте, как осуществляется управление вашими данными
ОС iOS 8 и iOS 9
Перейдите в меню «Настройки» > «Конфиденциальность» > «Диагностика и использование» и выберите вариант «Отправлять автоматически» или «Не отправлять». Вместе с параметром «Отправлять автоматически» можно включить настройку «Делиться с разработчиками». Разрешив компании Apple передавать разработчикам различные данные и статистику использования их программ, вы поможете им улучшать свое ПО.
ОС iOS 5, iOS 6 и iOS 7
Перейдите в меню «Настройки» > «Основные» > «Об этом устройстве» > «Диагностика и использование» и выберите вариант «Отправлять автоматически» или «Не отправлять».
ОС iOS 4 и более ранней версии
- Подключите iPad, iPhone или iPod touch к компьютеру Mac или компьютеру с ОС Windows.
- Дождитесь появления устройства на левой панели окна iTunes в списке «Устройства».
- Выберите свое устройство и щелкните «Сбросить предупреждения» в нижней части окна обзора.
Если эта команда отсутствует, щелкните значок устройства правой кнопкой мыши (на компьютере Mac или компьютере с ОС Windows) или левой кнопкой мыши с зажатой клавишей Control (на компьютере Mac) и выберите «Сбросить предупреждения» в контекстном меню.
При следующей синхронизации после сброса предупреждений должно появиться показанное ниже окно.
Чтобы отказаться и остановить отправку сведений о диагностике и использовании в компанию Apple, нажмите «Не отправлять».
Если показанное выше окно не отображается
- Отключите устройство от компьютера.
- Откройте программу на устройстве.
- Нажмите и удерживайте кнопку «Режим сна/Пробуждение» до появления ползунка выключения, затем нажмите и удерживайте кнопку «Домой», пока приложение не завершит работу. При использовании iOS 2.x или более ранней версии нажмите и удерживайте нажатой кнопку «Домой», пока приложение не завершит работу.
- Подключите устройство и синхронизируйте его с iTunes.
- Запрос согласия на сбор данных диагностики или отказа от сбора должен появиться снова.
Информация о продуктах, произведенных не компанией Apple, а также о независимых веб-сайтах, неподконтрольных компании Apple и не тестируемых ею, не носит рекомендательного или одобрительного характера. Компания Apple не несет никакой ответственности за выбор, функциональность и использование веб-сайтов или продукции сторонних производителей. Компания Apple также не несет ответственности за точность или достоверность данных, размещенных на веб-сайтах сторонних производителей. Обратитесь к стороннему поставщику за дополнительной информацией.
Логи в iOS, эпизод 1: os_log

Представьте, что вы садитесь делать новый проект для iOS/iPadOS/macOS/tvOS/watchOS. Очень скоро сталкиваетесь с первым багом и, чтобы его понять и исправить, добавляете логи — вызываете print() тут и там. Баг исправили и часть логов убрали, а часть оставили на будущее — полезные, ещё пригодятся.
Спустя пару месяцев работы над проектом консоль в Xcode превращается в водопад из логов. В них сложно разобраться, в них невозможно ориентироваться. Принимаете это как данность и в новые логи для удобства добавляете какие-то маркеты по типу «——>» или ещё что-нибудь в этом духе — так их можно будет различить в бесконечном потоке.
Это работает, но ровно до тех пор, пока не перестаёт. В этот момент не выдерживаете и чистите большую часть бесполезных, по вашему мнению, логов, случайно зацепляя вместе с ними и полезные. Теперь у вас остались какие-то логи, которые что-то показывают. Какова их ценность — не ясно.
Давайте расскажу, как Apple предлагает решать эту проблему.
Console.app
Apple предлагает читать логи в специальном приложении — Console.app, которое встроено в macOS. Но если его запустить и выбрать устройство с вашим запущенным приложением, то вы увидите ещё бо́льшую портянку сообщений: тут и системные логи, и логи приложений других разработчиков.

Отфильтруйте только до вашего приложения. Для этого справа сверху есть поле поиска. Для этой статьи я сделал приложение LogsDemo, так что именно его и ввожу в поле поиска:

Всё ещё показываются какие-то системные логи — потому что мы в поле поиска сказали показать любые логи от LogsDemo. По умолчанию это включает в себя и логи от iOS, которые случились в следствие работы нашей приложухи.
Фильтры
Давайте немного уточним фильтр. У нас есть разные варианты:

Нам подойдут Library , Equals :

Пусто. Это потому что print() выводит лог напрямую в консоль Xcode, а Console.app пытается читать логи из лог-файлов. Чтобы запись шла в эти самые лог-файлы, нужно print() заменить на os_log() . Apple называет это частью Unified Logging System.
Заменяем, получается так:
let message = "Наше с вами сообщение, которое упадёт в логи" // вызов os_log требует инстанс OSLog let osLog = OSLog(subsystem: "LogsDemo", category: "") os_log(.debug, // говорим, что уровень лога будет 'debug' log: osLog, // передаём тот самый инстанс OSLog "%@", message as! CVarArg) // передаём наше сообщение
Запускаем проект и проверяем: в консоль Xcode логи падают, а в Console.app всё ещё нет:

Уровни логов
Логи уровня .debug не складываются в лог-файл, а сразу напрямую улетает в консоль Xcode. Чтобы лог долетел до консоли, достаточно поменять его уровень на любой другой.
Всего уровней пять:
public static let `default`: OSLogType public static let info: OSLogType public static let debug: OSLogType public static let error: OSLogType public static let fault: OSLogType
Давайте пока укажем .default и проверим:

Наконец-то то, что надо. Но каждый раз вводить в поиске название приложения и уточнять фильтр — лень. Хорошо, что фильтры можно сохранять: прямо под полем поиска есть кнопка Save. Нажимаем, вводим имя для фильтра и он появляется в тулбаре:

Можно даже фильтр воткнуть только на ошибки. Вызываем контекстное меню лога с ошибкой и просим показать только ошибки:

И теперь у нас показываются только логи с уровнем .error:

Источник лога
Гораздо чаще при дебаге хочется смотреть не «только ошибки», а логи «только из модуля N». Мы активно пилим приложение Додо Пиццы на модули — их у нас уже 62. Посмотреть только логи из сети — вполне нормальный для нас кейс. В демо-проекте тоже есть модуль Network, давайте отфильтруем логи до него. Но откуда взять название текущего модуля? И куда его передавать? Писать вручную звучит как сложная задача. Да и если файл с кодом между модулями переносить, то можно забыть обновить передаваемое название.
А что если я скажу, что правильное название можно автоматически получить без напряга? Его вернёт выражение #fileID :
let fileID: StaticString = #fileID // результат — LogsDemo/ViewController.swift let module = URL(fileURLWithPath: self).deletingPathExtension().pathComponents[1] // результат — LogsDemo
Теперь в Console.app можно добавить фильтр по Subsystem: Network и увидеть только логи из модуля Network :

Модуль знаем. Что дальше?
- Название файла можно достать точно так же, как и название модуля, прямо из #fileID .
- Название функции можно достать из #function .
- Строчку из #line .
А теперь склеиваем это всё в одно сообщение:
// Раньше в OSLog в поле subsystem мы подавали название приложения // Но оно и так в любом случае пишется в логи в поле Library // Так что мы вместо названия приложения теперь подаём название модуля let osLog = OSLog(subsystem: module, category: "") let fileFunction = [filename, function].joined(separator: ".") let source = [fileFunction, line].joined(separator: ":") let formattedMessage = [source, message].joined(separator: "\n\n") os_log(.default, log: osLog, "%@", formattedMessage)
В Console.app так:

Теперь мы знаем, в каком модуле, в каком файле и на какой строчке что произошло. Ну, если залогировали.
А что ещё можно?
Да что угодно — os_log принимает любое текстовое сообщение и выводит его в консоль.
enum TaxCalculationError: Error < case invalidTaxConfig >let message = String(reflecting: TaxCalculationError.invalidTaxConfig) os_log(.error, log: logger, "%@", message)
Замер? Тоже можно:
// логируем старт let startMessage = "Will get profile" // специального уровня для замеров нет, так что используем дефолтный os_log(.default, log: logger, "%@", startMessage) // запоминаем во сколько мы начали let startDate = Date() // выполняем какой-то долгий код let response = networkService.data(for: ProfileRequest()) let profileModel = ProfileModel(response) // запоминаем во сколько мы закончили let endDate = Date() // сравниваем конечное и стартовое время let duration = endDate.timeInterval(since: startDate) let durationFormatter = String(format: "%.2f", duration) // логируем конец с продолжительностью let endMessage = "Got profile, took \(durationFormatter)s" os_log(.default, log: logger, "%@", endMessage)
Заключение
Связка os_log и Console.app — мощный инструмент. Вы можете логировать сетевой слой вашего приложения, происходящие в любой момент ошибки, а так же замерить, сколько времени у вас выполнялась та или иная функция и вывести это текстом в логи.
Но для его использования приходится писать много сопроводительного кода. Бойлерплейта, уж простите мне это слово. Надо и обычные сообщения форматировать, и ошибки правильно показывать, и замеры выполнения функций как-то ещё припихнуть. Как этого избежать — расскажу в одной из следующих статей. Подписывайтесь, ставьте лайки, отправляйте эту статью друзьям.
Если хотите узнавать быстрее и больше о мобильной разработке в Dodo Engineering в коротком формате — подписывайтесь на телеграм-канал Dodo Mobile.
- Блог компании Dodo Engineering
- Программирование
- Разработка под iOS
- Разработка мобильных приложений
Журналы iOS | iOS Logs
6. После открытия домашней страницы тестового приложения или веб-сайта нажмите «Возобновить».
7. Пересмотрите ошибку, о которой вы сообщаете
8. Нажмите Пауза, затем нажмите Сохранить
9. Сохраните файл в расширении .txt
10. Загрузить его в свой отчет об ошибке
Альтернативный способ получения журнала устройства iOS с Windows
Вы можете использовать приложение под названием 3utools. Это быстрый и простой способ получить журналы устройства на вашем устройстве iOS с помощью Windows.
Как установить 3utools и записывать логи с его помощью:
2. Нажмите Скачать на домашней странице
3. Установить файл
4. Откройте 3utools и подключите устройство iOS к компьютеру
5. Нажмите Toolbox в верхней части 3uTools
6. Открыть журнал в реальном времени
7. Пауза и очистить консоль