使用OSLog在Swift中清除和搜索日志

探索Apple当前推荐的日志记录方法

特别是在登录Swift和iOS应用程序时,首先想到的API可能是printNSLog 。 但是,最近,Apple以统一日志记录的形式引入了新的日志记录标准,可以通过OSLog访问。 这是当前推荐的日志记录方式,提供了一种在我们的应用程序中捕获信息的有效方法。

统一日志记录对以前的技术进行了许多改进,并且与我们习惯的有所不同。

  1. 可以在适当的级别记录每条消息,包括:默认,错误,调试和信息。 它们会影响向我们显示和保留消息的方式。
  2. 消息按子系统和类别分组,以实现有效的搜索和过滤。
  3. 由于系统是为提高性能而设计的,并且仅在读取时才呈现日志,因此无需将日志语句包装在条件语句中。
  4. 认真考虑用户隐私,需要将动态字符串内容显式标记为public,否则将在任何日志中将其删除。

让我们开始记录

从Swift使用统一日志记录就像使用os_log函数一样简单,我们很快就会注意到,它使用StaticString作为参数而不是常规String 。 记录消息的最简单方法是将String常量直接放在函数调用中。 可以将消息提取到属性,但是,我们需要将其类型定义为StaticString

由于StaticString要求,我们需要使用format参数,而不是使用字符串插值。 最初可能会感到不舒服,但是要适应它并不难,它为用户隐私提供了好处,我们将在后面讨论。 我们可以访问所有标准格式参数,以及许多附加值类型的解码器。 想法是,日志记录系统会为您处理尽可能多的格式,以使系统效率更高。

有条理很好

调用os_log可以指定要使用的OSLog ,其中包含特定的子系统和类别。 在筛选,搜索和稍后尝试了解我们的日志时,此信息非常宝贵。 如果未指定log参数,则使用默认参数,该参数未配置子系统或类别。

子系统将特定应用程序或模块的所有日志分组,从而使我们能够过滤所有自己的日志。 从评估Apple的日志来看,子系统的约定是反向域样式,例如应用程序或框架本身的捆绑标识符。 如果将应用程序模块化到框架中,则最好使用框架的捆绑标识符将日志分为相应的组件。

类别用于将日志分组到相关区域,以帮助我们缩小日志消息的范围。 类别的约定是使用易于理解的名称,例如UIUser 。 我们可以将日志分组为跨多个子系统或功能(例如NetworkContacts 。 或者,我们可以将特定类的所有日志分组,例如Contacts Repository 。 在同一个项目中结合使用这两种方法是完全可以接受的,我们应该简单地使用最合适的类别,以使我们了解项目日志消息的上下文。

我们可以将不同的类别和子系统添加为OSLog的扩展,从而可以在整个应用程序中轻松访问它们。 将它们存储在一个地方可以避免在整个代码库中创建OSLog实例,并有助于使使用中的不同类别井井有条。

记录级别

统一日志记录系统采用一组不同的日志记录级别,在这些级别上,我们可以针对不同类型的消息。 级别控制如何向我们显示消息,如何以及何时保留消息以及是否在不同环境中捕获消息。 甚至可以通过我们机器上的命令行来定制系统如何处理每个级别。 为每个消息使用最合适的日志记录级别是一个好主意,以最大限度地利用我们的日志记录系统。

默认值 :如果没有其他合适的级别,则捕获可能导致失败并实质上回退的所有内容。 除非更改,否则消息将存储在内存缓冲区中,并在消息填满后保留。

信息 :捕获可能有用但未直接用于诊断或排除错误的任何内容。 除非更改,否则不使用持久性,消息仅存储在内存缓冲区中,并在消息填满时清除。

调试 :在开发过程中捕获信息以诊断特定问题,同时积极调试。 除非通过配置更改启用它们,否则不会捕获它们。

错误 :捕获应用程序错误和故障,尤其是关键事件。 消息始终保持不变,以确保不会丢失。

错误 :仅捕获系统级或多进程错误,可能未在我们的应用程序代码中使用。 与错误级别一样,消息始终保持不变。

在每个级别进行记录都非常简单, OSLogType将相应的OSLogType指定为os_log调用的参数即可。

用户隐私

为了确保私人用户数据不会意外地保留在应用程序日志中,并可以与其他人共享,统一日志记录系统具有公共和私有参数过程。 默认情况下,仅收集标量(布尔,整数)值,并且删除了动态字符串或复杂的动态对象。 如有必要,可以将动态字符串参数声明为public,也可以将标量参数声明为private。

重要的是,我们禁止公开所有参数,因为这很容易导致私有公司或用户数据暴露在设备日志中。

阅读日志

附加调试器后,日志消息将显示在Xcode控制台中。 但是,读取日志的最佳方法是使用Console MacOS应用程序。 在这里,我们将能够对日志进行排序,过滤和搜索,以及更轻松地查看它们。

  • 在表中显示日志,使每个数据都易于阅读
  • 按子系统和类别搜索和过滤
  • 显示和隐藏每个日志消息的不同字段
  • 打开和关闭调试和信息级别消息
  • 保存搜索模式以在将来更轻松地访问它们

结论

统一日志记录是一种有前途且功能强大的日志记录解决方案,尤其是在性能和​​筛选日志消息方面。 最初,它似乎与您从NSLogprint所使用的内容有古怪或不同之处。 在多了一些并为os_log提供子系统,类别并充分利用了日志记录级别之后,您会发现它使使用日志变得非常容易。 如果您想要更多的日志覆盖范围和更好的性能,可以os_log NSLogprint语句,然后开始将os_log集成到您的应用程序中。

OSLog是Apple当前推荐的日志记录方法

OSLog不止我们在此探讨的内容,例如用于监视应用程序性能的路标,因此将来我们可能会在另一篇文章中再次讨论该主题。

您是否已经开始使用OSLog ,如果可以,您对此有何看法? 如果您不打算使用它,那么做出该决定的原因是什么? 如果您对尝试使用OSLog其他开发人员有任何建议,我希望听到他们的建议。 如果您有任何疑问或想法,或有任何其他疑问,请随时通过Twitter @lordcodes与我联系。

如果您喜欢阅读的内容,请随时分享文章并订阅我的供稿。

感谢您的阅读和愉快的编码! 🙏