使用OSLog在Swift中清除和搜索日志
探索Apple当前推荐的日志记录方法
特别是在登录Swift和iOS应用程序时,首先想到的API可能是print
和NSLog
。 但是,最近,Apple以统一日志记录的形式引入了新的日志记录标准,可以通过OSLog
访问。 这是当前推荐的日志记录方式,提供了一种在我们的应用程序中捕获信息的有效方法。
统一日志记录对以前的技术进行了许多改进,并且与我们习惯的有所不同。
- 可以在适当的级别记录每条消息,包括:默认,错误,调试和信息。 它们会影响向我们显示和保留消息的方式。
- 消息按子系统和类别分组,以实现有效的搜索和过滤。
- 由于系统是为提高性能而设计的,并且仅在读取时才呈现日志,因此无需将日志语句包装在条件语句中。
- 认真考虑用户隐私,需要将动态字符串内容显式标记为public,否则将在任何日志中将其删除。
让我们开始记录
从Swift使用统一日志记录就像使用os_log
函数一样简单,我们很快就会注意到,它使用StaticString
作为参数而不是常规String
。 记录消息的最简单方法是将String
常量直接放在函数调用中。 可以将消息提取到属性,但是,我们需要将其类型定义为StaticString
。
由于StaticString
要求,我们需要使用format参数,而不是使用字符串插值。 最初可能会感到不舒服,但是要适应它并不难,它为用户隐私提供了好处,我们将在后面讨论。 我们可以访问所有标准格式参数,以及许多附加值类型的解码器。 想法是,日志记录系统会为您处理尽可能多的格式,以使系统效率更高。
有条理很好
调用os_log
可以指定要使用的OSLog
,其中包含特定的子系统和类别。 在筛选,搜索和稍后尝试了解我们的日志时,此信息非常宝贵。 如果未指定log参数,则使用默认参数,该参数未配置子系统或类别。
子系统将特定应用程序或模块的所有日志分组,从而使我们能够过滤所有自己的日志。 从评估Apple的日志来看,子系统的约定是反向域样式,例如应用程序或框架本身的捆绑标识符。 如果将应用程序模块化到框架中,则最好使用框架的捆绑标识符将日志分为相应的组件。
类别用于将日志分组到相关区域,以帮助我们缩小日志消息的范围。 类别的约定是使用易于理解的名称,例如UI
或User
。 我们可以将日志分组为跨多个子系统或功能(例如Network
或Contacts
。 或者,我们可以将特定类的所有日志分组,例如Contacts Repository
。 在同一个项目中结合使用这两种方法是完全可以接受的,我们应该简单地使用最合适的类别,以使我们了解项目日志消息的上下文。
我们可以将不同的类别和子系统添加为OSLog
的扩展,从而可以在整个应用程序中轻松访问它们。 将它们存储在一个地方可以避免在整个代码库中创建OSLog
实例,并有助于使使用中的不同类别井井有条。
记录级别
统一日志记录系统采用一组不同的日志记录级别,在这些级别上,我们可以针对不同类型的消息。 级别控制如何向我们显示消息,如何以及何时保留消息以及是否在不同环境中捕获消息。 甚至可以通过我们机器上的命令行来定制系统如何处理每个级别。 为每个消息使用最合适的日志记录级别是一个好主意,以最大限度地利用我们的日志记录系统。
默认值 :如果没有其他合适的级别,则捕获可能导致失败并实质上回退的所有内容。 除非更改,否则消息将存储在内存缓冲区中,并在消息填满后保留。
信息 :捕获可能有用但未直接用于诊断或排除错误的任何内容。 除非更改,否则不使用持久性,消息仅存储在内存缓冲区中,并在消息填满时清除。
调试 :在开发过程中捕获信息以诊断特定问题,同时积极调试。 除非通过配置更改启用它们,否则不会捕获它们。
错误 :捕获应用程序错误和故障,尤其是关键事件。 消息始终保持不变,以确保不会丢失。
错误 :仅捕获系统级或多进程错误,可能未在我们的应用程序代码中使用。 与错误级别一样,消息始终保持不变。
在每个级别进行记录都非常简单, OSLogType
将相应的OSLogType
指定为os_log
调用的参数即可。
用户隐私
为了确保私人用户数据不会意外地保留在应用程序日志中,并可以与其他人共享,统一日志记录系统具有公共和私有参数过程。 默认情况下,仅收集标量(布尔,整数)值,并且删除了动态字符串或复杂的动态对象。 如有必要,可以将动态字符串参数声明为public,也可以将标量参数声明为private。
重要的是,我们禁止公开所有参数,因为这很容易导致私有公司或用户数据暴露在设备日志中。
阅读日志
附加调试器后,日志消息将显示在Xcode控制台中。 但是,读取日志的最佳方法是使用Console MacOS应用程序。 在这里,我们将能够对日志进行排序,过滤和搜索,以及更轻松地查看它们。
- 在表中显示日志,使每个数据都易于阅读
- 按子系统和类别搜索和过滤
- 显示和隐藏每个日志消息的不同字段
- 打开和关闭调试和信息级别消息
- 保存搜索模式以在将来更轻松地访问它们
结论
统一日志记录是一种有前途且功能强大的日志记录解决方案,尤其是在性能和筛选日志消息方面。 最初,它似乎与您从NSLog
和print
所使用的内容有古怪或不同之处。 在多了一些并为os_log
提供子系统,类别并充分利用了日志记录级别之后,您会发现它使使用日志变得非常容易。 如果您想要更多的日志覆盖范围和更好的性能,可以os_log
NSLog
并print
语句,然后开始将os_log
集成到您的应用程序中。
OSLog是Apple当前推荐的日志记录方法
OSLog
不止我们在此探讨的内容,例如用于监视应用程序性能的路标,因此将来我们可能会在另一篇文章中再次讨论该主题。
您是否已经开始使用OSLog
,如果可以,您对此有何看法? 如果您不打算使用它,那么做出该决定的原因是什么? 如果您对尝试使用OSLog
其他开发人员有任何建议,我希望听到他们的建议。 如果您有任何疑问或想法,或有任何其他疑问,请随时通过Twitter @lordcodes与我联系。
如果您喜欢阅读的内容,请随时分享文章并订阅我的供稿。
感谢您的阅读和愉快的编码! 🙏