Log - ShenYj/ShenYj.github.io GitHub Wiki

Log

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

⚠️ **GitHub.com Fallback** ⚠️