产品上线之后,总会有各种各样的环境导致会出现一些无法复现的问题,对于开发人员来说,这个时候的日志就是一个很重要的找错手段,如果能像Xcode调试的时候一样获取到所有的日志,那么至少会对我们排查错误会有一些帮助。
找到大概三种方式来记录日志:
- Apple System Log(ASL)
- 日志重定向
- 第三方框架(比较出名的 CocoaLumberjack )
Apple System Log
那么如何来记录日志呢,其实我们的日志主要是通过NSLog来输出到控制台的,所以从这里作为切入点找到记录日志的方法。
NSLog - Foundation | Apple Developer Documentation官方文档对NSLog的说明是
Logs an error message to the Apple System Log facility.
也就是说他会被作为error信息输出到Apple System Log中去了。
Apple System Log,以下简称ASL,是苹果自己实现的用于输出日志到系统日志库的一套API接口,在iOS真机设备上,ASL记录的log被缓存在本地沙盒中。
但是ASL在iOS 10开始,被Apple限制,废弃了ASLlink,所以在iOS 10之后的版本中,ASL变得不是那么方便。
日志重定向
不过通过官方文档中可以看到其实NSLog是将内容输出到文件中,然后打印出来,那么IO流的东西就会有文件的句柄了。
可以看到,在C语言中的三个默认句柄:
|
在OC当中也有对应的三个:
|
接下来,除了NSLog,还有c的printf输出。
printf会向标准输出stdout
打印;
NSLog会向标准错误stderr
打印;
既然是IO流的操作,我们就可以通过重定向将输出到控制台的内容保存到我们想要保存的路径中去。
freopen()
通过freopen()函数,我们可以将控制台打印的内容重定向到我们指定的文件中,但是重定向的一个问题就是会导致控制台中无法打印出任何内容,因为所有的输出都输出到了我们制定的内容中去了。
|
|
|
|
|
|
这里我们对stdout和stderr都进行了重定向,将他们输出到我们指定的Document目录下的xxx.log文件中(xxx是你自己定义的名字)。另外为了防止在调试过程中和在模拟器中看不到Xcode中的调试内容,在这里做了判断,在Xcode中和模拟器环境中不进行重定向。
同样的,取出这部分内容也很容易,直接通过文件系统就可以取出来了。
|
|
接下来只需要在AppDelegate中当应用启动时调用就可以了。
|
|
dup2
(转摘自iOS 日志获取和实时浏览器显示日志 - iOS - 掘金)
|
|
使用:
|
|
dispatch_source
(转摘自iOS 日志获取和实时浏览器显示日志 - iOS - 掘金)
|
|
使用时:
|
|
第三方库
这里主要以GitHub - CocoaLumberjack/CocoaLumberjack: A fast & simple, yet powerful & flexible logging framework for Mac and iOS为代表的一些第三方库,具体的就不多介绍了。需要的可以直接去GitHub找找。
最后
以上就是对iOS中日志记录的一些简单的方法,主要是以freopen方法重定向为主,其他的主要是根据其他大佬的文章看了看。
本文章仅限个人学习使用,如果有什么问题还请大佬多多指教。
参考文档
Logging | Apple Developer Documentation
Activity Tracing | Apple Developer Documentation
iOS – NSLog、UncaughtException日志保存到文件 - 程序园
iOS - How can I capture iPhone console logs programmatically? - Stack Overflow
iOS - Read logs using the new swift os_log api - Stack Overflow