目录
[1. 使用控制台应用程序](#1. 使用控制台应用程序)
[2. 使用命令行工具](#2. 使用命令行工具)
[3. 通过Xcode Devices窗口](#3. 通过Xcode Devices窗口)
[1. 使用空格(默认 AND 逻辑)](#1. 使用空格(默认 AND 逻辑))
[2. 使用引号(精确短语搜索)](#2. 使用引号(精确短语搜索))
[3. 使用逻辑运算符(OR, NOT)](#3. 使用逻辑运算符(OR, NOT))
[4. 组合使用(构建复杂查询)](#4. 组合使用(构建复杂查询))
[在 Xcode 控制台中的技巧](#在 Xcode 控制台中的技巧)
是否必须运行Xcode项目才能查看日志?
不完全正确。虽然通过Xcode运行应用是最直接的查看日志方式,但还有其他方法可以访问设备日志,包括在不运行项目的情况下。
不运行项目时查看设备日志的方法
1. 使用控制台应用程序
macOS自带的控制台应用可以实时查看连接设备的日志:
-
连接iOS设备到Mac
-
打开"应用程序" > "实用工具" > "控制台"
-
在左侧选择您的iOS设备
-
即可查看设备的所有日志,包括系统日志和其他应用的日志

2. 使用命令行工具
通过命令行工具也可以获取设备日志:
bash
# 查看连接的设备列表
xcrun xctrace list devices
# 流式输出设备日志
xcrun xctrace stream --device <设备UDID> --level debug
或者使用log
命令:
bash
# 流式输出设备日志
log stream --device <设备UDID> --predicate 'process == "YourAppName"'
3. 通过Xcode Devices窗口
-
在Xcode中,选择"Window" > "Devices and Simulators"
-
选择连接的设备
-
点击底部"Open Console"按钮
-
即可查看设备实时日志
在代码中记录日志的最佳实践
为了更好地管理日志,建议使用统一的方式记录日志:
bash
import os.log
class Logger {
static let shared = Logger()
private let log: OSLog
private init() {
log = OSLog(subsystem: "com.youcompany.yourapp", category: "general")
}
func debug(_ message: String) {
os_log("%{public}@", log: log, type: .debug, message)
}
func info(_ message: String) {
os_log("%{public}@", log: log, type: .info, message)
}
func error(_ message: String) {
os_log("%{public}@", log: log, type: .error, message)
}
}
// 使用示例
Logger.shared.debug("这是一个调试信息")
过滤和搜索日志的技巧
无论是在控制台还是Xcode中查看日志,过滤都是关键:
-
进程名 (Process) :
process == "YourAppName"
-
适用场景:快速聚焦于你的应用产生的所有日志,排除系统和其他应用的干扰。
-
提示 :在真机上,你的应用进程名后面可能会带一串数字(如
YourAppName.12345
),这时使用process CONTAINS "YourAppName"
会更可靠。
-
-
子系统 (Subsystem) :
subsystem == "com.yourcompany.yourapp"
-
适用场景 :这是最精确的过滤方式。如果你在代码中使用了
OSLog
并指定了 Subsystem,这能完美地筛选出你需要的日志。 -
提示:强烈推荐在代码中统一使用你自己的 Subsystem,这样排查问题极其方便。
-
-
级别 (Level) :
level >= error
-
适用场景:快速找出错误(Error)和故障(Fault)级别的日志,这些通常是需要优先处理的问题。
-
级别说明:
-
fault
(最高级,系统级错误) -
error
(应用级错误) -
default
(默认,普通信息) -
info
(调试信息) -
debug
(最详细,开发时用) -
trace
(最最低级,极少用)
-
-
-
类别 (Category) :
category == "Network"
- 适用场景 :如果你在代码中为
OSLog
创建了不同的 Category(如 "UI", "Network", "Database"),可以用这个来过滤特定功能模块的日志。
- 适用场景 :如果你在代码中为
-
消息内容 (Message) :
message CONTAINS "login"
- 适用场景:在所有日志中搜索包含特定词汇的条目。
多个关键字的设置方法
在控制台 (Console) 应用的搜索框或过滤器栏中,设置多个关键字有以下几种方式,其逻辑完全不同:
1. 使用空格(默认 AND 逻辑)
在搜索框中简单地用空格分隔多个词 ,控制台会执行 "AND" 操作,即搜索同时包含所有这些词的日志条目。
-
示例 :
error login
-
效果:搜索既包含 "error" 又包含 "login" 的日志行。
-
结果示例:
-
[ERROR] User login failed
(匹配) -
User login successful
(不匹配,没有 error) -
[ERROR] File not found
(不匹配,没有 login)
-
2. 使用引号(精确短语搜索)
用引号将多个词括起来,表示要将它们作为一个完整的短语进行搜索。
-
示例 :
"failed to authenticate"
-
效果:搜索完整包含 "failed to authenticate" 这个短语的日志行。
-
结果示例:
-
The user failed to authenticate with the server
(匹配) -
Authentication failed. Please try again.
(不匹配,不是完整短语)
-
3. 使用逻辑运算符(OR, NOT)
控制台支持简单的逻辑运算符,让你构建更复杂的查询。
-
OR 操作 :使用大写的
OR
-
示例 :
error OR fault
-
效果 :搜索包含 "error" 或 "fault" 的日志行。
-
-
NOT 操作 :使用大写的
NOT
或减号-
-
示例1 :
error NOT network
-
示例2 :
error -network
-
效果 :搜索包含 "error" 但不包含 "network" 的日志行。
-
4. 组合使用(构建复杂查询)
你可以将上述所有方法组合起来,创建强大的过滤条件。
-
复杂示例1 :
process == "YourApp" AND (level >= error OR message CONTAINS "exception")
- 效果:过滤出你的应用中,所有错误级别以上的日志,或者消息里包含 "exception" 的日志。
-
复杂示例2 :
subsystem == "com.yourapp" AND message CONTAINS "http" AND -"200 OK"
- 效果 :在你的应用子系统中,找出所有包含 "http" 但不包含 "200 OK" 的日志(用于查找非200的HTTP请求)。
在 Xcode 控制台中的技巧
在 Xcode 底部调试控制台查看日志时,过滤更简单:
-
筛选按钮 (Filter Bar) :点击控制台右下角的漏斗图标,可以按
Debug
,Info
,Error
等级别快速过滤。 -
搜索框:
-
直接输入关键词进行过滤。
-
多个关键字 :同样使用空格 表示 AND 。例如输入
error login
会只显示同时包含这两个词的行。 -
不支持
OR
,NOT
等高级运算符,但可以通过正则表达式(见下文)。
-
-
右键菜单:在控制台消息上右键,可以选择 "Hide..." 来隐藏来自某个系统或类似消息。
高级技巧:使用正则表达式 (Regex)
无论是 macOS 控制台还是 Xcode 控制台,都支持正则表达式搜索,功能极其强大。
-
在 macOS 控制台 :点击搜索框,选择 "Regex" (或者使用快捷键
Cmd + R
切换)。 -
在 Xcode :点击控制台搜索框最右边的图标,勾选 "Editor → Show Filters" ,然后在弹出的过滤栏中选择正则表达式图标
.*
。
正则表达式示例:
-
error|failure
:查找包含 "error" 或 "failure" 的行(相当于OR
)。 -
(?i)null
:不区分大小写地查找 "null"(NULL
,Null
,null
都能匹配)。 -
\b5\d\d\b
:查找所有5xx的HTTP状态码(如500, 503等)。
总结
不需要运行Xcode项目也能查看设备日志。通过macOS控制台、命令行工具或Xcode的Devices窗口,开发者可以访问连接设备的系统日志和应用日志。掌握这些技巧将大大提高调试效率,特别是在处理后台运行、推送通知或性能优化等场景时。
建议在开发过程中结合使用多种日志查看方法,并根据需要创建适当的日志过滤条件,以便快速定位和解决