iOS学习笔记40-日志重定向

作者: 执着丶执念 | 来源:发表于2016-04-22 12:20 被阅读1377次

    一、日志重定向

    我们在iOS开发过程中,我们时常会使用NSLog打印到控制台的日志信息进行代码调试,但这样调试的前提是连接上Xcode。
    如果进行真机调试但同时又不能连接Xcode的时候,就不能直接在xcode的控制台查看输出日志了,但是程序还是会执行那些Log的,如果要查看这些日志,我们就需要把输出日志信息保存到文件中,然后进行查看。

    标准NSLog的打印默认是往标准错误(stderr)进行打印的,我们只需要修改NSLog的打印输出路径即可实现日志重定向

    以下是日志重定向代码:
    #pragma mark - 用户方法,将NSLog的输出信息写入到文件中
    /* 将NSlog打印信息保存到Document目录下的文件中 */
    - (void)redirectLogToDocumentFolder
    {
        // 获取沙盒路径
        NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask,YES);
        NSString *documentDirectory = [paths objectAtIndex:0];
        // 获取打印输出文件路径
        NSString *fileName = [NSString stringWithFormat:@"myData.log"];
        NSString *logFilePath = [documentDirectory stringByAppendingPathComponent:fileName];
        // 先删除已经存在的文件
        NSFileManager *defaultManager = [NSFileManager defaultManager];
        [defaultManager removeItemAtPath:logFilePath error:nil];
        // 将NSLog的输出重定向到文件,因为C语言的printf打印是往stdout打印的,这里也把它重定向到文件
        freopen([logFilePath cStringUsingEncoding:NSASCIIStringEncoding],"a+", stdout);
        freopen([logFilePath cStringUsingEncoding:NSASCIIStringEncoding],"a+", stderr);
    }
    

    AppDelegateapplication:didFinishLaunchingWithOptions:中调用:

    - (BOOL)application:(UIApplication *)application 
            didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
    {
        // 重定向Log日志信息到Document文件中
        [self redirectLogToDocumentFolder];
        return YES;
    }
    

    到这里还没结束,因为你的Log日志信息已经打印到了真机应用的沙盒文件中,你还需要把它拷贝到你的Mac上进行查看,你就需要设置共享文件配置 :

    在应用程序的Info.plist文件中添加UIFileSharingEnabled键,并将键值设置为YES

    一旦iOS设备插入到用户计算机,iTunes就会在选中设备的Apps标签中显示一个文件分享区域。设置了文件共享后,用户就可以向该目录添加文件或者将文件移动到桌面计算机中。就是说,设置了文件共享后,一旦设备连接上电脑,可以通过iTune查看指定应用程序的共享文件夹,将文件拷贝到你的电脑上看。



    二、文件流知识补充

    1. 打开文件

    FILE *fp = fopen(文件路径,打开方式);

    打开方式:
    • r : 读,如果文件不存在返回NULL,存在就打开
    • w : 写,如果文件存在则覆盖,不存在则创建
    • a : 追加,如果文件存在则追加,不存在则创建
    • r+ : 在r的基础上,多增加了写的权限
    • w+ : 在w的基础上,多增加了读的权限
    • a+ : 在a的基础上,多增加了读的权限
    • t : 文本文件(默认的),结合有rt、wt、at、rt+
    • b : 二进制文件,结合有rb、wb、ab、rb+
    2. 文件操作
    1. char ch = fgetc(文件指针);
      作用:从文件中读取一个字符
      【fgetc和getc没有区别,用法也一样】
    1. fputc(字符,文件指针);
      作用:写入一个字符到文件
    2. fgets(字符数组,长度n,文件指针);
      作用:从文件指针指向的文件中读取n-1个字符存到字符数组里,会自动在后面加\0,字符数组用来保存你读取出来的字符串
      【遇到“\n”立即结束读取】
    3. fputs(字符串,文件指针);
      作用:写入一个字符串到文件指针指向的文件
    4. fread(保存数据的首地址,每块的大小,多少块,文件指针);
      作用:从文件指针指向的文件中分块读取(文件指针),告诉它一次读取多少块(多少块),每块多大(第二个参数),存到哪(第一个参数)
      【它只关心具体读的字节数,不会关心这些自己里面有没有换行 】
    5. fwrite(数据的首地址,每块的大小,多少块,文件指针);
      作用:将数据分块写入到文件指针指向的文件。第一个是告诉系统,写入什么数据,第二个是告诉系统每块多少字节,第三个是告诉系统分多少块写入,第四个是写入到哪个文件
    6. fscanf(文件指针,格式化控制符,地址列表);
      作用:格式化读取
    7. fprintf(文件指针,格式化控制符,参数列表);
      作用:格式化写入
    8. freopen(文件路径path, 打开方式mode, 文件指针fp);
      作用:实现重定向,把预定义的标准流文件定向到由path指定的文件中。标准流文件具体是指stdinstdoutstderr。其中stdin是标准输入流,默认为键盘;stdout是标准输出流,默认为屏幕;stderr是标准错误流,一般把屏幕设为默认。
    3. 关闭文件

    fclose(文件指针);

    有什么问题可以在下方评论区中提出!O(∩_∩)O哈!

    相关文章

      网友评论

      • 童冀:问下能不能重定向之后还能在控制台打印的
      • 李筱野:亲 在吗 我想知道 如何找到这个存log的文件 并上传到服务器呢
      • 纪宝宝:我是新手诶,可以交个朋友么:blush: 楼主做ios开发多久啦
        纪宝宝:@纪宝宝 我才做了半年多,:grin:在一家公司实习
        纪宝宝:@执着_执念 两年都是大神了好吧:sweat:还才,哎
        执着丶执念: @纪宝宝 可以啊,我做iOS也才2年

      本文标题:iOS学习笔记40-日志重定向

      本文链接:https://www.haomeiwen.com/subject/qxcxrttx.html