Console.app:它是什么,功能以及如何在macOS中读取日志

作者: IT Sectr 发布日期: 2026-05-29 阅读时间: 8 分钟

Console.app是macOS内置的应用程序,用于查看、过滤和分析系统及用户日志。它实时显示来自Apple统一日志记录系统(os_log)的消息,使开发人员无需连接到Xcode即可查看崩溃、错误和调试消息。根据Apple支持,Console.app支持按子系统、类别、严重级别和进程进行过滤,以及将日志导出为.logarchive格式以便传递给开发人员。这是在Mac上诊断问题的不可或缺的工具:过滤器和已保存的搜索使您能够在数千条系统消息中快速找到应用程序中的错误。

要点

  • Console.app — 内置的macOS日志查看器,与Apple统一日志记录系统配合使用
  • 过滤 — 按子系统、类别、级别(错误、故障、调试)和消息文本进行搜索,支持正则表达式
  • 模式 — 实时(实时流)和历史(归档日志),通过工具栏切换
  • 导出 — 将日志保存为.logarchive、.txt和.json格式,以便传递给开发人员或附加到错误报告中
  • 已保存的搜索 — 为典型场景命名的过滤器:所有应用程序错误、网络日志、崩溃报告器

什么是Console.app

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界面

Console.app界面由三个主要区域组成:带有过滤器的侧边栏、消息表格和所选消息的详细信息面板。侧边栏包含设备(可用的日志源)、报告(系统崩溃报告)和已保存的搜索(保存的搜索查询)部分。

消息表格显示日志列表,包含以下列:时间(时间戳)、类别(类别)、级别(严重级别 — 颜色指示)、进程(进程名称)、消息(消息文本)。单击任何消息都会打开详细信息面板,其中显示子系统、活动标识符、线程ID和带有格式的完整文本。

Console.app用颜色突出显示消息:红色表示故障,黄色表示错误,蓝色表示调试,灰色表示信息。默认消息不突出显示。这使得可以直观地扫描日志流并立即发现关键事件。

swift
// 将出现在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中的过滤器和搜索

过滤 — 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中打开 — 日志来自远程设备,但过滤器和搜索与本地日志的工作方式相同。

swift
// 通过终端导出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压缩,存档的大小明显小于原始日志。在发送之前,确保日志不包含私人数据:使用应用程序的子系统过滤器排除可能包含其他进程机密信息的系统日志。

通过Console.app进行调试的实践示例

无需Xcode诊断崩溃:如果应用程序在Xcode外部启动时崩溃,Console.app将显示来自进程的故障消息。在侧边栏中找到报告→崩溃报告 — 那里显示带有签名和堆栈的完整崩溃报告。使用应用程序的子系统过滤器并设置错误+故障级别,以查看崩溃前的所有关键事件。

通过Console.app进行性能分析

Console.app允许基于时间戳跟踪应用程序中的延迟。如果两个相关消息之间(例如,“请求已发送”和“响应已收到”)经过的时间超过预期 — 这是性能问题的信号。使用默认级别的应用程序子系统过滤器,将以毫秒精度显示所有关键事件。

查找内存泄漏:发生内存泄漏时,系统通过os_log发送带有memory类别和错误级别的内存警告。在Console.app中按memory一词过滤,并选择您的子系统。如果警告每5–10秒重复一次 — 应用程序正在积极消耗内存。此外,可以启用调试日志以跟踪分配。

调试网络请求:如果您的应用程序使用os_log记录网络事件,Console.app将显示所有请求和响应及时间信息。category=network过滤器减少噪音。如果请求和响应之间的时间超过预期,请查找level=Error的消息 — 它们将指示超时或DNS错误。

swift
// 用于解析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在Mac上的什么位置?

Console.app位于/Applications/Utilities/文件夹中。可以通过Spotlight(⌘空格→Console)或通过Finder→应用程序→实用工具→控制台打开。应用程序图标是一个带有齿轮的样式化对话气泡。

为什么Console.app显示<private>而不是值?

os_log默认将字符串和对象屏蔽为private。Console.app在生产模式下将其显示为<private>。要查看实际值,请从Xcode启动应用程序,或为您的子系统启用调试级别的收集配置文件。

如何只过滤我自己的应用程序的日志?

在Console.app的侧边栏中,在设备→您的设备→进程部分选择您的子系统(com.example.app)。另一种方法 — 在搜索框中输入进程名称,然后从下拉列表中选择Process: YourApp。

Console.app保存日志多长时间?

默认情况下,macOS将日志存储在.tracev3中7–14天,具体取决于可用磁盘空间。空间不足时,最旧的日志会自动删除。可以通过sudo log config延长存储时间,但不建议在生产机器上这样做。

可以在Console.app中查看iOS设备的日志吗?

可以,通过USB将iOS设备连接到Mac,打开Xcode→设备→选择设备→打开控制台。Console.app将实时显示连接设备的日志。对于独立收集,请在终端中使用log collect命令加上--device标志。

总结

  • Console.app — 用于查看统一日志记录(os_log)日志的内置macOS工具,不需要Xcode或额外安装
  • 过滤器 — 按子系统、类别、严重级别、文本和带AND条件的正则表达式搜索,用于隔离特定应用程序的日志记录
  • 模式 — 实时(延迟1–5秒的实时流)和历史(7–14天存档)用于分析已发生的问题
  • 导出 — 带有完整元数据的.logarchive用于发送给同事,.json用于程序分析,.txt用于快速查看
  • 诊断 — 无需Xcode即可查找崩溃、内存泄漏和网络错误,通过过滤错误和关键崩溃并带有故障颜色指示
  • 远程设备 — 通过Xcode查看iOS设备日志,或通过log collect导出并在Mac上的Console.app中打开.logarchive
  • 隐私 — os_log在生产模式下在Console.app中屏蔽<private>数据;对于调试,使用Xcode或调试级别的收集配置文件

我们将开发一款交钥匙移动应用程序

IT Sectr自2017年以来为初创企业和企业打造iOS和Android应用程序。我们将为您提供咨询并提出最佳解决方案。

讨论项目

另请阅读