目录
是否必须运行Xcode项目才能查看日志?
不完全正确。虽然通过Xcode运行应用是最直接的查看日志方式,但还有其他方法可以访问设备日志,包括在不运行项目的情况下。
不运行项目时查看设备日志的方法
1. 使用控制台应用程序
macOS自带的控制台应用可以实时查看连接设备的日志:
连接iOS设备到Mac
打开"应用程序" > "实用工具" > "控制台"
在左侧选择您的iOS设备
即可查看设备的所有日志,包括系统日志和其他应用的日志
2. 使用命令行工具
通过命令行工具也可以获取设备日志:
# 查看连接的设备列表
xcrun xctrace list devices
# 流式输出设备日志
xcrun xctrace stream --device <设备UDID> --level debug
或者使用log
命令:
# 流式输出设备日志
log stream --device <设备UDID> --predicate 'process == "YourAppName"'
3. 通过Xcode Devices窗口
在Xcode中,选择"Window" > "Devices and Simulators"
选择连接的设备
点击底部"Open Console"按钮
即可查看设备实时日志
在代码中记录日志的最佳实践
为了更好地管理日志,建议使用统一的方式记录日志:
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窗口,开发者可以访问连接设备的系统日志和应用日志。掌握这些技巧将大大提高调试效率,特别是在处理后台运行、推送通知或性能优化等场景时。
建议在开发过程中结合使用多种日志查看方法,并根据需要创建适当的日志过滤条件,以便快速定位和解决