有次排查一个线上问题的复现场景:App 在特定操作下才会触发异常,Xcode Console 连上设备后要等索引加载完才能看到日志输出,而且日志流里混了大量系统消息,目标 App 的输出淹没在其中。当时想,能不能只显示这个 App 的日志,过滤掉系统的不相关内容。

NSLog 和 OSLog

iOS 的日志输出主要有两种方式。NSLog 是最传统的方式,直接把文本输出到系统日志,Xcode Console 和第三方工具都能捕获到。NSLog 的缺点是性能开销大,大量日志输出会影响 UI 帧率,上线前通常需要注释或删除。

OSLog 是 iOS 10 引入的统一日志系统。通过 os_log 函数输出日志,支持分级(default、info、debug、error、fault),可以按级别过滤。OSLog 比 NSLog 性能好很多,可以在 release 版本中保留 debug 级别的日志用于线上问题排查。

在终端里可以用 log stream --level debug --predicate 'subsystem == "com.example.app"' 查看 OSLog 输出,配合 –predicate 按子系统和类别筛选。日志重定向也可以用 log collect 收集设备日志。

Xcode Console 的使用

Xcode 的 Console 界面可以查看连接设备的实时日志。顶部的搜索框支持按进程或关键词过滤,日志会按时间排序输出。问题在于 Xcode 启动慢,而且 Console 的日志量大时筛选会卡,只能看开发阶段连接的设备。

KeyMob 的实时日志功能

KeyMob 的实时日志入口在左侧导航栏的"实时日志"模块。点击绿色的开始按钮后输出 iOS 设备的日志流,支持两个维度的过滤。

一是关键词过滤——在"只抓包含关键词的日志"输入框里填关键字,工具只输出包含这些文字的日志行。对于调试特定功能模块很有用——比如只显示包含 “Payment” 或 “Login” 的日志。

二是按 App 过滤——在应用管理模式下选择目标 App,点击运行或实时日志按钮。运行按钮会显示 App 内 NSLog 和 printf 函数的完整输出,实时日志按钮只显示 NSLog 输出。2 的区别在于 printf 的输出在某些场景下会包含更多调试信息。

如果要在开发过程中同时看日志和性能数据,KeyMob 可以在不关闭日志界面的情况下切换到性能图表看 CPU 和内存数据。日志和性能问题往往是关联的——卡顿出现前的日志会保留,配合性能曲线能更快找到异常点。

崩溃日志的查看

KeyMob 的崩溃日志模块也在日志体系下。连上设备后在文件管理里找到 CrashReporter 目录,日志文件按"应用名-日期-时间.ips"命名。点击直接查看原始崩溃堆栈,不需要手动符号化。实时日志和崩溃日志可以配合使用——先看闪退前的最后几条日志,再到崩溃日志看堆栈信息,定位路径更短。

使用场景

真机调试时用 KeyMob 看实时日志,比每次打开 Xcode 等加载快。生产线上的疑难问题需要看日志时,可以在 Windows 上连设备直接用 KeyMob 捕获,不依赖 Mac。做自动化测试时,可以用命令行工具收集关键节点的日志输出。