Console.app — це вбудований додаток macOS для перегляду, фільтрації та аналізу системних і користувацьких логів. Він відображає повідомлення з уніфікованої системи журналювання Apple (os_log) у реальному часі, дозволяючи розробнику бачити збої, помилки та налагоджувальні повідомлення без підключення до Xcode. Згідно з Apple Support, Console.app підтримує фільтрацію за підсистемою, категорією, рівнем критичності та процесом, а також експорт логів у .logarchive для передачі розробнику. Це незамінний інструмент для діагностики проблем на Mac: фільтри та збережені пошуки дозволяють швидко знаходити помилки в додатку серед тисяч системних повідомлень.
Головне
Console.app — це графічний інтерфейс до уніфікованої системи журналювання Apple. Вона замінила старий додаток Console (як частина macOS) і надає доступ до всіх системних логів та логів додатків, записаних через API os_log, os_trace та syslog. Console.app доступна в /Applications/Utilities/ на будь-якому Mac.
На відміну від Xcode, який показує логи лише для запущеного з IDE додатка, Console.app відображає логи всіх процесів у системі одночасно. Це дозволяє діагностувати проблеми, які виникають лише при запуску додатка поза Xcode або у фоновому режимі. Console.app також показує системні логи — kernel, launchd, WindowServer, що корисно для налагодження низькорівневих проблем.
Console.app не вимагає встановлення додаткових інструментів або підключення до Інтернету. Усі дані зберігаються локально в базі даних .tracev3, і додаток працює повністю офлайн. Для перегляду логів з іншого Mac або пристрою iOS використовується команда log collect з наступним відкриттям .logarchive у Console.app.
Інтерфейс Console.app складається з трьох основних областей: бічної панелі з фільтрами, таблиці повідомлень та панелі деталей вибраного повідомлення. Бічна панель містить розділи Devices (доступні джерела логів), Reports (системні звіти про збої) та Saved Searches (збережені пошукові запити).
Таблиця повідомлень відображає список логів з колонками: Time (часова мітка), Category (категорія), Level (рівень критичності — кольорова індикація), Process (ім'я процесу), Message (текст повідомлення). Клік на будь-якому повідомленні відкриває панель деталей, де показано підсистему, ідентифікатор активності, ідентифікатор потоку та повний текст із форматуванням.
Console.app підсвічує повідомлення кольором: червоний для Fault, жовтий для Error, синій для Debug, сірий для Info. Повідомлення за замовчуванням не підсвічуються. Це дозволяє візуально сканувати потік логів і миттєво помічати критичні події.
// Логи, які з'являться в Console.app
import OSLog
let logger = Logger(
subsystem: "com.example.myapp",
category: "network"
)
logger.error("Connection failed: timeout")
logger.debug("Retry attempt 3 of 5")
// Ці повідомлення видно в Console.app з фільтром "myapp"
Фільтрація — основна функція Console.app, яка перетворює потік із тисяч повідомлень на секунду в читабельний список. Поле пошуку у верхній частині підтримує умови AND: кілька слів, розділених пробілом, відображають лише повідомлення, що містять усі слова. Наприклад, myapp error покаже всі логи додатка myapp з рівнем Error.
Фільтр підсистеми у бічній панелі дозволяє вибрати одну або кілька підсистем. Це найшвидший спосіб ізолювати логи конкретного додатка від системних повідомлень. Фільтр категорії доступний після вибору підсистеми — він показує всі категорії, які використовує вибраний додаток. Фільтр рівня обмежує повідомлення за рівнем критичності: можна показати лише помилки або лише налагоджувальні повідомлення.
| Тип фільтра | Приклад | Результат |
|---|---|---|
| Текст | crash payment | Повідомлення, що містять crash І payment |
| Subsystem | com.example.myapp | Лише логи вказаного додатка |
| Level | Error + Fault | Лише помилки та критичні збої |
| Category | network | Повідомлення з категорією network |
| Час | Остання 1 година | Повідомлення лише за вибраний інтервал |
Поле пошуку Console.app підтримує регулярні вирази через конструкцію REGEX:pattern. Приклад: REGEX:error.*tim(e|out) знайде всі повідомлення, що містять «error» і слово, яке починається на «tim» і закінчується на «e» або «out». Регулярні вирази працюють лише в полі пошуку, а не у фільтрах підсистеми або категорії.
Live — режим реального часу, у якому Console.app показує нові повідомлення в міру їх появи в кільцевому буфері ядра. Цей режим активний за замовчуванням і підходить для налагодження працюючого додатка: ви запускаєте додаток і бачите його логи із затримкою 1–5 секунд. Кнопка Live (або ⌘L) вмикає та вимикає потік.
Historical — режим перегляду архіву. Console.app зберігає всі повідомлення за останні 7–14 днів (налаштовується в системі) у базі даних .tracev3. Режим Historical відкриває цей архів і дозволяє шукати в ньому за будь-якими фільтрами, а не лише за поточним потоком. Це незамінно для аналізу проблем, які сталися вночі або коли додаток працював без підключення до Mac.
Перемикання між режимами відбувається через кнопку Live на панелі інструментів. Коли Live вимкнено, Console.app показує історичні дані. У цьому режимі можна переміщатися за часовою шкалою за допомогою календаря або кнопок ← →. Історичні дані доступні лише для логів, які були збережені на диск — повідомлення, які були перезаписані в кільцевому буфері, до архіву не потрапляють.
Console.app підтримує експорт відфільтрованих логів у кілька форматів. File → Export → Save дозволяє вибрати формат: .logarchive (рідний формат Apple, включає всі метадані), .txt (звичайний текст із колонками) та .json (структуровані дані з полями). Для прикріплення до звіту про помилку використовуйте .logarchive — його можна відкрити на будь-якому Mac у Console.app.
Експорт з пристрою iOS: через Xcode (Devices → Open Console) або через команду log collect --device --output ./archive.logarchive у терміналі. Отриманий .logarchive відкрийте в Console.app на Mac — логи надходять з віддаленого пристрою, але фільтри та пошук працюють так само, як із локальними логами.
// Експорт логів пристрою iOS через термінал
// log collect --device --output ./ios_crash.logarchive
// log show --subsystem com.example.app --last 1h --output json
// Приклад: вивантажити логи за останню годину
// log show --predicate 'subsystem == "com.example.myapp"' \
// --info --debug --last 1h --output json > logs.json
// Розбір вивантажених логів у Swift
let jsonData = try Data(contentsOf: URL(fileURLWithPath: "logs.json"))
let decoded = try JSONDecoder()
.decode([LogEntry].self, from: jsonData)
.logarchive — оптимальний формат для відправки колезі або прикріплення до JIRA-тікета. Файл містить не лише повідомлення, але й підсистему, категорію, часові мітки, ідентифікатори потоків та всі метадані. Розмір архіву значно менший за сирі логи завдяки стисненню .tracev3. Перед відправкою переконайтеся, що в логах немає приватних даних: використовуйте фільтр за підсистемою вашого додатка, щоб виключити системні логи, які можуть містити конфіденційну інформацію інших процесів.
Діагностика збою без Xcode: якщо додаток впав при запуску не з Xcode, Console.app покаже повідомлення Fault від процесу. Знайдіть у бічній панелі Reports → Crash Reports — там відображаються повні звіти про падіння з сигнатурою та стеком. Використовуйте фільтр підсистеми для вашого додатка та встановіть рівень Error+Fault, щоб побачити всі критичні події перед збоєм.
Console.app дозволяє відстежувати затримки в додатку за часовими мітками. Якщо між двома пов'язаними повідомленнями (наприклад, «запит надіслано» та «відповідь отримано») минуло більше очікуваного часу — це сигнал про проблему з продуктивністю. Фільтр за підсистемою вашого додатка з рівнем Default покаже всі ключові події з точністю до мілісекунди.
Пошук витоку пам'яті: при витоку пам'яті система надсилає попередження про пам'ять через os_log з категорією memory та рівнем Error. У Console.app відфільтруйте за словом memory та виберіть вашу підсистему. Якщо попередження повторюється кожні 5–10 секунд — додаток активно споживає пам'ять. Додатково можна ввімкнути Debug-логи для відстеження розподілів.
Налагодження мережевих запитів: якщо ваш додаток використовує os_log для мережевих подій, Console.app покаже всі запити та відповіді з часом. Фільтр category=network зменшить шум. Якщо час між запитом і відповіддю перевищує очікуваний, шукайте повідомлення з level=Error — вони вкажуть на тайм-аути або помилки DNS.
// Структура для розбору JSON-логів Console.app
struct LogEntry: Codable {
let timestamp: String
let eventMessage: String
let subsystem: String
let category: String
let messageType: UInt8
var level: String {
switch messageType {
case 1: return "Fault"
case 16: return "Error"
case 17: return "Debug"
default: return "Default"
}
}
}
Часті запитання
Console.app знаходиться в папці /Applications/Utilities/. Відкрити її можна через Spotlight (⌘Пробіл → Console) або через Finder → Програми → Службові програми → Консоль. Іконка додатка — стилізована мовна виноска з шестернею.
os_log маскує рядки та об'єкти як private за замовчуванням. Console.app відображає їх як <private> у виробничому режимі. Щоб побачити реальні значення, запустіть додаток з Xcode або ввімкніть профіль збору з рівнем Debug для вашої підсистеми.
У бічній панелі Console.app виберіть вашу підсистему (com.example.app) у розділі Devices → ваш пристрій → Processes. Альтернатива — введіть ім'я процесу в поле пошуку та виберіть Process: YourApp з випадаючого списку.
За замовчуванням macOS зберігає логи в .tracev3 протягом 7–14 днів залежно від доступного дискового простору. При нестачі місця найстаріші логи видаляються автоматично. Термін зберігання можна збільшити через sudo log config, але це не рекомендується для виробничих машин.
Так, підключіть пристрій iOS до Mac через USB, відкрийте Xcode → Devices → виберіть пристрій → Open Console. Console.app відобразить логи підключеного пристрою в реальному часі. Для автономного збору використовуйте log collect у терміналі з прапорцем --device.
Підсумки
Ми розробимо мобільний застосунок під ключ
IT Sectr створює застосунки для iOS та Android для стартапів і бізнесу з 2017 року. Ми проконсультуємо вас і запропонуємо найкраще рішення.
Читайте також