Console.appは、システムログおよびユーザーログの表示、フィルタリング、分析を行うためのmacOS内蔵アプリケーションです。Appleのunified loggingシステム(os_log)からのメッセージをリアルタイムで表示し、Xcodeに接続しなくてもクラッシュ、エラー、デバッグメッセージを確認できます。Apple Supportによると、Console.appはサブシステム、カテゴリ、重要度レベル、プロセスによるフィルタリングをサポートし、.logarchiveへのログのエクスポートも可能です。これはMacでの問題診断に不可欠なツールです。フィルターと保存された検索により、数千のシステムメッセージの中からアプリケーションのエラーを素早く見つけることができます。
重要なポイント
Console.appは、Appleのunified loggingシステムのグラフィカルインターフェースです。古いConsoleアプリケーション(macOSの一部として)を置き換え、os_log、os_trace、syslog APIを通じて書き込まれたすべてのシステムおよびアプリケーションログへのアクセスを提供します。Console.appは任意のMacの/Applications/Utilities/にあります。
XcodeがIDEから起動したアプリケーションのログしか表示しないのに対し、Console.appはシステム上のすべてのプロセスのログを同時に表示します。これにより、Xcodeの外部やバックグラウンドでアプリケーションを起動した場合にのみ発生する問題を診断できます。Console.appはカーネル、launchd、WindowServerなどのシステムログも表示するため、低レベルの問題のデバッグに役立ちます。
Console.appは追加のツールのインストールやインターネット接続を必要としません。すべてのデータは.tracev3データベースにローカルに保存され、アプリケーションは完全にオフラインで動作します。別のMacやiOSデバイスからログを表示するには、log collectコマンドを使用してから、.logarchiveをConsole.appで開きます。
Console.appのインターフェースは、フィルター付きのサイドバー、メッセージテーブル、選択したメッセージの詳細パネルの3つの主要エリアで構成されています。サイドバーには、Devices(利用可能なログソース)、Reports(システムクラッシュレポート)、Saved Searches(保存された検索クエリ)のセクションがあります。
メッセージテーブルには、Time(タイムスタンプ)、Category(カテゴリ)、Level(重要度レベル — 色分け表示)、Process(プロセス名)、Message(メッセージテキスト)の列を持つログのリストが表示されます。任意のメッセージをクリックすると詳細パネルが開き、サブシステム、アクティビティ識別子、スレッドID、書式付きの完全なテキストが表示されます。
Console.appはメッセージを色で強調表示します:Faultは赤、Errorは黄、Debugは青、Infoはグレー。Defaultメッセージは強調表示されません。これにより、ログストリームを視覚的にスキャンし、重大なイベントを即座に把握できます。
// 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")
// これらのメッセージはフィルター「myapp」を適用したConsole.appで表示されます
フィルタリングはConsole.appの主要機能であり、毎秒数千のメッセージのストリームを読み取り可能なリストに変換します。上部の検索フィールドはAND条件をサポートしています:スペースで区切られた複数の単語は、すべての単語を含むメッセージのみを表示します。例えば、myapp errorと入力すると、Errorレベルのmyappアプリケーションのすべてのログが表示されます。
サイドバーのサブシステムフィルターでは、1つ以上のサブシステムを選択できます。これは、システムメッセージから特定のアプリケーションのログを分離する最も速い方法です。カテゴリフィルターはサブシステムを選択した後に利用可能になり、選択したアプリケーションで使用されているすべてのカテゴリを表示します。レベルフィルターは重要度レベルに応じてメッセージを制限します:エラーのみ、またはデバッグメッセージのみを表示できます。
| フィルターの種類 | 例 | 結果 |
|---|---|---|
| テキスト | 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は履歴データを表示します。このモードでは、カレンダーまたは← →ボタンを使用してタイムラインを移動できます。Historicalデータはディスクに保存されたログに対してのみ利用可能で、リングバッファで上書きされたメッセージはアーカイブに含まれません。
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をMacのConsole.appで開くと、リモートデバイスからのログが表示されますが、フィルターと検索はローカルログと同じように機能します。
// ターミナル経由のiOSデバイスログのエクスポート
// log collect --device --output ./ios_crash.logarchive
// log show --subsystem com.example.app --last 1h --output json
// 例:過去1時間のログをエクスポート
// 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チケットに添付したりするのに最適な形式です。ファイルにはメッセージだけでなく、サブシステム、カテゴリ、タイムスタンプ、スレッドID、およびすべてのメタデータが含まれます。.tracev3圧縮のおかげで、アーカイブサイズは生のログよりも大幅に小さくなります。送信前にログにプライベートデータが含まれていないことを確認してください:アプリケーションのサブシステムでフィルターを使用して、他のプロセスの機密情報を含む可能性のあるシステムログを除外します。
Xcodeなしでのクラッシュ診断:アプリケーションがXcodeの外部で起動時にクラッシュした場合、Console.appはプロセスからのFaultメッセージを表示します。サイドバーでReports → Crash Reportsを探してください。署名とスタックを伴う完全なクラッシュレポートが表示されます。アプリケーションのサブシステムフィルターを使用し、レベルをError+Faultに設定して、クラッシュ前のすべての重大なイベントを確認します。
Console.appを使用すると、タイムスタンプを使ってアプリケーションの遅延を追跡できます。2つの関連するメッセージ(例:“リクエスト送信”と“応答受信”)の間に予想以上の時間が経過した場合、それはパフォーマンスの問題のシグナルです。Defaultレベルのアプリケーションのサブシステムフィルターは、ミリ秒単位の精度で主要なイベントをすべて表示します。
メモリリークの発見:メモリリークが発生すると、システムはmemoryカテゴリとErrorレベルでos_logを介してメモリ警告を送信します。Console.appでmemoryという単語でフィルターし、サブシステムを選択します。警告が5〜10秒ごとに繰り返される場合、アプリケーションはメモリを積極的に消費しています。割り当てを追跡するためにDebugログを有効にすることもできます。
ネットワークリクエストのデバッグ:アプリケーションがネットワークイベントにos_logを使用している場合、Console.appはすべてのリクエストとレスポンスをタイミングとともに表示します。category=networkフィルターでノイズを低減します。リクエストとレスポンスの間の時間が予想を超える場合は、level=Errorのメッセージを探してください — タイムアウトやDNSエラーを示しています。
// Console.app JSONログ解析用の構造
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 → アプリケーション → ユーティリティ → Consoleから開けます。アプリアイコンは歯車の付いたスタイライズされた吹き出しです。
os_logはデフォルトで文字列とオブジェクトをprivateとしてマスクします。Console.appはプロダクションモードでそれらを<private>として表示します。実際の値を確認するには、Xcodeからアプリケーションを起動するか、サブシステムのDebugレベルの収集プロファイルを有効にします。
Console.appのサイドバーで、Devices → デバイス → Processesセクションからサブシステム(com.example.app)を選択します。または、検索フィールドにプロセス名を入力し、ドロップダウンリストからProcess:YourAppを選択します。
デフォルトでは、macOSは利用可能なディスク容量に応じて、ログを.tracev3に7〜14日間保存します。容量が不足すると、最も古いログから自動的に削除されます。sudo log configで保存期間を延長できますが、プロダクションマシンでは推奨されません。
はい、iOSデバイスをUSBでMacに接続し、Xcode → Devicesを開いてデバイスを選択し、Open Consoleをクリックします。Console.appは接続されたデバイスのログをリアルタイムで表示します。オフライン収集の場合は、ターミナルで--deviceフラグを付けてlog collectを使用します。
まとめ
ターンキー方式のモバイルアプリケーションを開発します
IT Sectrは2017年からスタートアップや企業向けにiOS・Androidアプリケーションを開発しています。私たちがご相談に乗り、最適なソリューションをご提案します。