Tag: 统一日志

统一日志记录和活动跟踪

去年,苹果对所有更新平台(iOS 10,watchOS 3,tvOS 10,macOS 10.12)的日志记录系统进行了重大更改:现在,将旧的ASL和Syslog API重定向到了新的统一日志记录,从而大大改善了活动跟踪。 这是一个关于我如何采用它们来调试用Swift3编写的极其异步的watchOS3 / iOS10应用程序的故事。 为什么要进行统一日志记录? 认识Fox:具有watchOS3扩展功能的iOS10应用。 Fox正在通过Apple Watch的加速度计跟踪用户的运动活动,将原始数据传输到手机,然后传输到服务器以进行进一步的大数据分析。 棘手的事情是:用户参加医学研究并且他的生活非常艰苦,因此Fox不应在白天打扰他,它应该在后台运行并以静默方式收集数据。 至于watchOS3,watchapps主要被视为前台应用程序,后台执行仅用于更新UI。 对于Dock中的应用程序,每小时可以获得一次后台执行时间;对于在当前表盘上拥有活动Complication的应用程序,则可以获得每小时两次的后台执行时间。 在每个后台任务中,Fox应该从运动传感器请求加速度计数据(这是异步完成的),将其写入文件,放置到传输队列中,等到将其传输到iPhone并获得传输成功无误的响应。 另外,我们希望通过在N个并发操作中运行此请求数据文件传输响应来提高性能。 我们希望日志能够调试整个事情。 像大多数iOS项目一样,第一动力是使用像Crashlytics或Cocoalumberjack这样的流行的第三方框架。 令人失望的是:Crashlytics仍然缺乏watchOS支持,并且想像一下我在Cocoalumberjack的普通文本日志中看到的一团糟,当时四个线程和许多回调开始同时将消息推送到文件末尾。 另一个问题是观察者效应 :通过Cocoalumberjack编写的每条消息都占用了CPU时间,更改了整个算法的时间,并且在后台任务期间处理的数据量更少。 watchOS3具有斯巴达式的限制:如果您的上一个后台任务花费的时间太长或占用了过多的CPU,则OS不会为您提供后台执行时间。 这种伐木造成的危害大于利润。 因此,我需要快速的日志记录系统,适合异步代码,并具有不受欢迎的Apple平台支持。 我已经决定从根本上尝试原生的统一日志记录和活动跟踪。 记录中 功能,如WWDC会话721中所述: 分类和过滤 :每条消息都有子系统,类别,四个级别之一(默认,信息,调试,故障,错误),已启用标志和目标(磁盘或内存)。 隐私 :通过用字替换动态字符串,集合和数组,防止将个人身份信息意外泄漏到存储的日志中。 可以在每个参数的基础上覆盖此行为。 可用性 :日志记录系统为您收集呼叫者信息,内置类型说明符可简化消息准备。 性能 :观察者影响最小。 数据存储在/ var / db / diagnostics /中的二进制.tracev3文件中,并以.logarchive文件传输(两种文件格式都可以使用macOS Sierra中更新的Console.app打开)。 整个系统的日志被写入一个位置。 尽管在WWDC会话幻灯片中描述了许多C函数,但在Swift中的用法却非常简单:一个os_log函数以静态字符串 (在编译时称为)接受消息,并带有占位符作为参数,参数本身, OSLog(如果要使用非参数) -default子系统和类别,以及用于日志级别的枚举 。 仅消息字符串是必需的: func os_log(_消息:StaticString, […]