跳到主要内容

Xcode 15:2023年值得使用的 OSLog 新特性

· 阅读需 4 分钟
GoSwiftUI
goswiftui.com

在 2023 年,Xcode 15 带来了新功能,支持结构化日志,让使用 OSLog 变得更加值得推荐。现在可以通过筛选功能在调试控制台中只看到来自自己应用程序的日志,还能高亮显示警告和错误。对于需要更多信息的情况,只需按一下相应日志行即可。然而,需要注意结构化日志仅适用于 iOS 17 及以上版本,但对于早期版本,仍可使用旧的os_log。配置日志记录器时,习惯上使用应用程序标识符作为子系统,模块名作为类别。整体上,这些改进使得 OSLog 在技术文章中更加实用。

OSLog 是一个长期可用的统一日志框架,但我一直没有大量采用它。但随着 WWDC 2023 的新功能,情况即将发生改变。

Xcode 15(目前为测试版)在调试控制台中支持结构化日志

目前日志记录存在的问题

目前,我的 Xcode 14 调试控制台中充斥着太多日志,来自其他框架甚至操作系统本身!

2023-07-25 14:39:38.819584+0800 MyApp[12:34] [WC] WCSession is not paired
2023-07-25 14:39:38.819834+0800 MyApp[12:34] [WC] -[WCSession onqueue_handleUpdateSessionState:]_block_invoke dropping as pairingIDs no longer match. pairingID (null), client pairingID: (null)
2023-07-25 14:39:38.997445+0800 MyApp[34:56] [MediaRemote] [ConcreteOutputContext] WARNING: AVF context unavailable for +[MRAVConcreteOutputContext sharedAudioPresentationContext]_block_invoke
2023-07-25 14:39:49.499876+0800 MyApp[56:78] 9.6.0 - [FirebaseAnalytics][I-ACS023007] Analytics v.9.6.0 started
2023-07-25 14:39:49.889278+0800 MyApp[56:78] 9.6.0 - [FirebaseAnalytics][I-ACS023008] To enable debug logging set the following application argument: -FIRAnalyticsDebugEnabled (see http://goo.gl/RfcP7r)

太多的噪音。

我已经尝试过如何减少调试日志,但这需要额外的步骤。

Xcode 15 的解决方案

Xcode 15 添加了筛选功能,因此我可以只看到来自我的应用程序的日志(筛选子系统)。它甚至用黄色突出显示警告和用红色突出显示错误。

img

当然,您也可以按类别或消息进行筛选。

我还喜欢将视图配置为不显示其他元数据,以便每个日志都只有一行。

img

然后,当您希望查看更多信息时,可以按一下行上的空格。

img

您甚至可以使用 CMD + OPT + SHIFT + J 进行跳转到源代码

很棒!

仅适用于 iOS 17

即使您在 Xcode 15 上运行,需要注意结构化日志仅适用于 iOS 17(测试版)。在 iOS 16 上运行将像使用print一样显示日志。不过,您仍然可以打开“Console”应用程序来查看它的完整效果。

另外,Logger类在 iOS 14 中引入。如果您支持任何更早的 iOS 版本,仍然可以使用旧的os_log

如何记录日志

通常,我会在扩展中设置所有的日志记录器。按照惯例,子系统是您的应用程序标识符,而类别是您的模块名。

import OSLog
extension Logger {
private static let appIdentifier = Bundle.main.bundleIdentifier ?? ""
static let main = Logger(subsystem: appIdentifier, category: "main")
static let camera = Logger(subsystem: appIdentifier, category: "camera")
}

使用时,您可以简单地调用Logger.camera.info(...)