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
起开放使用,部分功能需要更高版本