Crash日志收集 上传到服务器

方法一: 利用苹果系统自带的崩溃日志来统计信息.
引用作者:[作者地址][1]
[1]:http://www.jianshu.com/p/ea1e6b210b27
方法二:[第三方工具]2

:下午再补充----

方法一:

  1. 新建一个CatchCrash类:
    CatchCrash.h
#import 

@interface CatchCrash : NSObject
void uncaughtExceptionHandler(NSException *exception);

@end

CatchCrash.m

#import "CatchCrash.h"

@implementation CatchCrash

//在AppDelegate中注册后,程序崩溃时会执行的方法
void uncaughtExceptionHandler(NSException *exception)
{
    //获取系统当前时间,(注:用[NSDate date]直接获取的是格林尼治时间,有时差)
    NSDateFormatter *formatter =[[NSDateFormatter alloc] init];
    [formatter setDateFormat:@"yyyy-MM-dd HH:mm:ss"];
    NSString *crashTime = [formatter stringFromDate:[NSDate date]];
    //异常的堆栈信息
    NSArray *stackArray = [exception callStackSymbols];
    //出现异常的原因
    NSString *reason = [exception reason];
    //异常名称
    NSString *name = [exception name];

    //拼接错误信息
    NSString *exceptionInfo = [NSString stringWithFormat:@"crashTime: %@ Exception reason: %@\nException name: %@\nException stack:%@", crashTime, name, reason, stackArray];

    //把错误信息保存到本地文件,设置errorLogPath路径下
    //并且经试验,此方法写入本地文件有效。
    NSString *errorLogPath = [NSString stringWithFormat:@"%@/Documents/error.log", NSHomeDirectory()];
    NSError *error = nil;
    BOOL isSuccess = [exceptionInfo writeToFile:errorLogPath atomically:YES encoding:NSUTF8StringEncoding error:nil];
    if (!isSuccess) {
        NSLog(@"将crash信息保存到本地失败: %@", error.userInfo);
}

2 . 完成了CatchCrash类,接下来,AppDelegate.h里 #import "CatchCrash.h"
在didFinishLaunchingWithOptions中添加如下代码(注册收集崩溃日志函数):

//注册消息处理函数的处理方法
//如此一来,程序崩溃时会自动进入CatchCrash.m的uncaughtExceptionHandler()方法
NSSetUncaughtExceptionHandler(&uncaughtExceptionHandler);

3 . 最后 在AppDelegate 中 didFinishLaunchingWithOptions 写崩溃日志上报逻辑 .

//若crash文件存在,则写入log并上传,然后删掉crash文件
NSFileManager *fileManager = [NSFileManager defaultManager];
NSString *errorLogPath = [NSString stringWithFormat:@"%@/Documents/error.log", NSHomeDirectory()];

if ([fileManager fileExistsAtPath:errorLogPath]) {
//上报逻辑
}
方法二 :第三方统计工具

你可能感兴趣的:(Crash日志收集 上传到服务器)