获取App的全量日志,能更好的获取App内各种活动信息,在查找问题原因时,能更好的看到App活动前后的信息,方便我们定位问题原因。
目录
1、获取系统自带 NSLog 的日志
1、获取系统自带 NSLog 的日志
1、NSLog 其实就是一个 C 函数,函数声明是:void NSLog(NSString *format, ...);
它的作用是,输出信息到标准的 Error 控制台和系统日志(syslog)中。在内部实现上,它其实使用的是 ASL(Apple System Logger,是苹果公司自己实现的一套输出日志的接口)的 API,将日志消息直接存储在磁盘上。那么,我们如何才能获取到通过 ASL 存放在系统日志中的日志呢?
ASL 会提供接口去查找所有的日志,通过 CocoaLumberjack 、简书上介绍使用 这个第三方日志库里的 DDASLLogCapture 这个类,我们可以找到实时捕获 NSLog 的方法。DDASLLogCapture 会在 start 方法里开启一个异步全局队列去捕获 ASL 存储的日志。start 方法的代码如下:
+ (void)start { ... dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^(void) { [self captureAslLogs]; }); }
2、获取 CocoaLumberjack 日志:
CocoaLumberjack 主要由 DDLog、DDLoger、DDLogFormatter 和 DDLogMessage 四部分组成,其整体架构如下图所示:
在这其中,DDLog 是个全局的单例类,会保存 DDLogger 协议的 logger;DDLogFormatter 用来格式化日志的格式;DDLogMessage 是对日志消息的一个封装;DDLogger 协议是由 DDAbstractLogger 实现的。logger 都是继承于 DDAbstractLogger:
日志输出到控制台是通过 DDTTYLogger 实现的;
DDASLLogger 就是用来捕获 NSLog 记录到 ASL 数据库的日志;
DDAbstractDatabaseLogger 是数据库操作的抽象接口;
DDFileLogger 是用来保存日志到文件的,还提供了返回 CocoaLumberjack 日志保存文件路径的方法,使用方法如下:
DDFileLogger *fileLogger = [[DDFileLogger alloc] init]; NSString *logDirectory = [fileLogger.logFileManager logsDirectory];
3、拿到Log日志文件,我们可以进行上传到我们的服务器系统。但是这么多日志我们都上传服务器可能不太方便现实。
1> 后台根据指定时间 抓取用户手机本地日志:
App在启动、从后台进入前台 一瞬间,开启一个异步接口,请求接口 获取 拉取日志的相关信息。然后我们根据本地的日志信息,遍历获取我们指定的日志范围,进行 上传日志到我们的服务器上面。
2> 建立长链接,收到 拉取日志的通知,进行 本地日志的拉取。这种方案不适合大都的App,因为我们不需要长链接。当有即时通讯的App的时候我们可以使用该方案。
介绍了 NSLog 和 CocoaLumberjack 日志的获取方法。这两种打日志的方式基本覆盖了大部分场景,你在使用其他日志库时,只要找到日志存储的目录,就可以进行日志的收集合并工作了。收集全量日志,可以提高分析和解决问题的效率,节省下来的时间我们可以去做更有意义的事情。