Log - ShenYj/ShenYj.github.io GitHub Wiki
OC 日常开发中最常见用的就是 NSLog
-
首先,
NSLog不是作为普通的debug log而设计的,而是error log,这一点在文档描述中可以说明NSLog(_:_:) Logs an error message to the Apple System Log facility. -
其次,
NSLog也并非是printf的简单封装,而是Apple System Log(后面简称ASL)的封装-
查看帮助信息
man asl
-
参考资料: sunnyxx:NSLog效率低下的原因及尝试lldb断点打印Log
从这篇博客中可以了解到
ASL大概就是个系统级别的log工具吧,syslog的替代版,提供了一系列强大的log功能。不过一般我们接触不到,NSLog就对它提供了高层次的封装,如这篇文档所提到的
一些底层相关的守护进程(deamons)不会link如Foundation等高层框架,所以asl用在这儿正合适;而对于应用层的用NSLog。
CocoaLumberjack 这样描述 NSLog 的性能问题
NSLog 会向 ASL写 log,同时向 Terminal 写 log,而且同时会出现在 Console.app中(Mac自带软件,用 NSLog 打出的 log在其中全部可见);不仅如此,每一次NSLog都会新建一个ASL client 并向 ASL 守护进程发起连接,log 之后再关闭连接。所以说,当这个过程出现N次时,消耗大量资源导致程序变慢也就不奇怪了
通常对 NSLog 的处理方案就是通过宏定义将 Release 中的log 过滤掉, 如果对汇编、lldb足够熟悉,动态调试也是可以的,另外的方案就是使用 CocoaLumberjack
我是从20年切换到 Swift 才开始使用 CocoaLumberjack 的 (准确的说是 CocoaLumberjackSwift),当时为了迁移 Swift 做了很多类库的调研,几乎是将现有功能完全切换 Swift 的库了,在一段时间后又在一些开源项目中见到了 OSLog 这个苹果提供的库,通过 OSLog 查阅资料才意识到 NSLog 的性能问题
os.log 部分功能在 iOS 10.0 起开放使用,部分功能需要更高版本