Console.app是macOS内置的应用程序,用于查看、过滤和分析系统及用户日志。它实时显示来自Apple统一日志记录系统(os_log)的消息,使开发人员无需连接到Xcode即可查看崩溃、错误和调试消息。根据Apple支持,Console.app支持按子系统、类别、严重级别和进程进行过滤,以及将日志导出为.logarchive格式以便传递给开发人员。这是在Mac上诊断问题的不可或缺的工具:过滤器和已保存的搜索使您能够在数千条系统消息中快速找到应用程序中的错误。
要点
Console.app是Apple统一日志记录系统的图形界面。它取代了旧的Console应用程序(作为macOS的一部分),并提供对通过os_log、os_trace和syslog API记录的所有系统和应用程序日志的访问。Console.app可在任何Mac的/Applications/Utilities/中找到。
与Xcode不同,Xcode只显示从IDE启动的应用程序的日志,而Console.app同时显示系统中所有进程的日志。这使您能够诊断仅在Xcode之外或后台启动应用程序时出现的问题。Console.app还显示系统日志 — 内核、launchd、WindowServer,这对于调试低级问题非常有用。
Console.app不需要安装额外的工具或互联网连接。所有数据都本地存储在.tracev3数据库中,应用程序完全离线工作。要查看来自其他Mac或iOS设备的日志,请使用log collect命令,然后在Console.app中打开.logarchive。
Console.app界面由三个主要区域组成:带有过滤器的侧边栏、消息表格和所选消息的详细信息面板。侧边栏包含设备(可用的日志源)、报告(系统崩溃报告)和已保存的搜索(保存的搜索查询)部分。
消息表格显示日志列表,包含以下列:时间(时间戳)、类别(类别)、级别(严重级别 — 颜色指示)、进程(进程名称)、消息(消息文本)。单击任何消息都会打开详细信息面板,其中显示子系统、活动标识符、线程ID和带有格式的完整文本。
Console.app用颜色突出显示消息:红色表示故障,黄色表示错误,蓝色表示调试,灰色表示信息。默认消息不突出显示。这使得可以直观地扫描日志流并立即发现关键事件。
// 将出现在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应用程序的所有错误级别的日志。
子系统过滤器在侧边栏中允许选择一个或多个子系统。这是将特定应用程序的日志与系统消息隔离的最快方法。类别过滤器在选择子系统后可用 — 它显示所选应用程序使用的所有类别。级别过滤器根据严重级别限制消息:可以只显示错误或只显示调试消息。
| 过滤类型 | 示例 | 结果 |
|---|---|---|
| 文本 | crash payment | 包含crash和payment的消息 |
| 子系统 | com.example.myapp | 仅指定应用程序的日志 |
| 级别 | 错误+故障 | 仅错误和关键崩溃 |
| 类别 | network | 具有network类别的消息 |
| 时间 | 最近1小时 | 仅选定时间间隔内的消息 |
Console.app的搜索框通过REGEX:pattern结构支持正则表达式。示例:REGEX:error.*tim(e|out)将找到所有包含“error”且单词以“tim”开头并以“e”或“out”结尾的消息。正则表达式仅在搜索框中工作,不在子系统或类别过滤器中工作。
实时 — 实时模式,Console.app在新消息出现在内核循环缓冲区时立即显示它们。此模式默认激活,适用于调试正在运行的应用程序:您启动应用程序并看到其日志,延迟1–5秒。实时按钮(或⌘L)打开和关闭流。
历史 — 查看存档的模式。Console.app在过去7–14天(可在系统中配置)内将所有消息存储在.tracev3数据库中。历史模式打开此存档,并允许按任何过滤器进行搜索,而不仅仅是当前流。这对于分析夜间或应用程序在没有连接到Mac的情况下运行时出现的问题是不可或缺的。
模式之间的切换通过工具栏上的实时按钮完成。当实时关闭时,Console.app显示历史数据。在此模式下,可以使用日历或← →按钮在时间线上导航。历史数据仅适用于已保存到磁盘的日志 — 在循环缓冲区中被覆盖的消息不会进入存档。
Console.app支持以多种格式导出过滤后的日志。文件→导出→保存选择格式:.logarchive(Apple原生格式,包含所有元数据)、.txt(带列的纯文本)和.json(带字段的结构化数据)。要附加到错误报告,请使用.logarchive — 它可以在任何Mac的Console.app中打开。
从iOS设备导出:通过Xcode(设备→打开控制台)或通过终端中的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
// 示例:导出最近一小时的日志
// 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将显示来自进程的故障消息。在侧边栏中找到报告→崩溃报告 — 那里显示带有签名和堆栈的完整崩溃报告。使用应用程序的子系统过滤器并设置错误+故障级别,以查看崩溃前的所有关键事件。
Console.app允许基于时间戳跟踪应用程序中的延迟。如果两个相关消息之间(例如,“请求已发送”和“响应已收到”)经过的时间超过预期 — 这是性能问题的信号。使用默认级别的应用程序子系统过滤器,将以毫秒精度显示所有关键事件。
查找内存泄漏:发生内存泄漏时,系统通过os_log发送带有memory类别和错误级别的内存警告。在Console.app中按memory一词过滤,并选择您的子系统。如果警告每5–10秒重复一次 — 应用程序正在积极消耗内存。此外,可以启用调试日志以跟踪分配。
调试网络请求:如果您的应用程序使用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→应用程序→实用工具→控制台打开。应用程序图标是一个带有齿轮的样式化对话气泡。
os_log默认将字符串和对象屏蔽为private。Console.app在生产模式下将其显示为<private>。要查看实际值,请从Xcode启动应用程序,或为您的子系统启用调试级别的收集配置文件。
在Console.app的侧边栏中,在设备→您的设备→进程部分选择您的子系统(com.example.app)。另一种方法 — 在搜索框中输入进程名称,然后从下拉列表中选择Process: YourApp。
默认情况下,macOS将日志存储在.tracev3中7–14天,具体取决于可用磁盘空间。空间不足时,最旧的日志会自动删除。可以通过sudo log config延长存储时间,但不建议在生产机器上这样做。
可以,通过USB将iOS设备连接到Mac,打开Xcode→设备→选择设备→打开控制台。Console.app将实时显示连接设备的日志。对于独立收集,请在终端中使用log collect命令加上--device标志。
总结
我们将开发一款交钥匙移动应用程序
IT Sectr自2017年以来为初创企业和企业打造iOS和Android应用程序。我们将为您提供咨询并提出最佳解决方案。