iOS 将Log日志输出到文件中保存

对于那些做后端开发的工程师来说,看LOGBug应该是理所当然的事,但我接触到的移动应用开发的工程师里面,很多人并没有这个意识,查Bug时总是一遍一遍的试图重现,试图调试,特别是对一些不太容易重现的Bug经常焦头烂额。而且iOS的异常机制比较复杂,Objective-C的语言驾驭也需要一定的功力,做出来的应用有时候挺容易产生崩溃闪退。一遍一遍的用XCode取应用崩溃记录、解析符号,通常不胜其烦,有时还对着解析出来的调用栈发呆,因为程序当时的内部状态常常难以看明白,只能去猜测。

对于真机,日志没法保存,不好分析问题。所以有必要将日志保存到应用的Docunment目录下,并设置成共享文件,这样才能取出分析。

首先是日志输出,分为cprintf和标准的NSLog输出,printf会向标准输出(sedout)打印,而NSLog则是向标准出错(stderr),我们需要同时让他们都将日志打印到一个文件中。

例子:

freopen("xx.log","a+",stdout);

freopen("xx.log","a+",stderr);

具体做法:

#pragma mark - 用户方法,nslog的输出信息写入到dr.log文件中

// NSlog打印信息保存到Document目录下的文件中

//此函数要在- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions中调用,这个函数在AppDelegate.m中实现的。

- (void)redirectNSlogToDocumentFolder

{

    NSArray *paths =NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask, YES);

   NSString *documentDirectory = [paths objectAtIndex:0];

   NSString *fileName = [NSStringstringWithFormat:@"dr.log"];//注意不是NSData!

   NSString *logFilePath = [documentDirectory stringByAppendingPathComponent:fileName];

    //先删除已经存在的文件

   NSFileManager *defaultManager = [NSFileManagerdefaultManager];

    [defaultManagerremoveItemAtPath:logFilePath error:nil];

    

    // log输入到文件

    freopen([logFilePathcStringUsingEncoding:NSASCIIStringEncoding],"a+", stdout);

    freopen([logFilePathcStringUsingEncoding:NSASCIIStringEncoding],"a+", stderr);

}

此函数要在- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions

中调用,这个函数在AppDelegate.m中实现的。

/*******************************************************************************/

    //当真机连接Mac调试的时候把这些注释掉,否则log只会输入到文件中,而不能从xcode的监视器中看到。

    // 如果是真机就保存到Document目录下的dr.log文件中

   UIDevice *device = [UIDevicecurrentDevice];

   if (![[device model]isEqualToString:@"iPad Simulator"]) {

        // 开始保存日志文件

        [selfredirectNSlogToDocumentFolder];

    }

    /*******************************************************************************/

最后配置共享文件夹:

在应用程序的Info.plist文件中添加UIFileSharingEnabled键,并将键值设置为YES。将您希望共享的文件放在应用程序的 Documents目录。一旦设备插入到用户计算机,iTunes9.1就会在选中设备的Apps标签中显示一个File Sharing区域。此后,用户就可以向该目录添加文件或者将文件移动到桌面计算机中。如果应用程序支持文件共享,当文件添加到Documents目录后,应用程序应该能够识别并做出适当响应。例如说,应用程序可以将新文件的内容显示界面上。请不要向用户展现目录的文件列表并询问他们希望对文件执行什么操作。

就是说,一旦设备连接上电脑,可以通过iTune查看指定应用程序的共享文件夹,将文件拷贝到你的电脑上看。


参考连接:

1.http://hi.baidu.com/ios_zb_com/item/ea528f4a8b1100d8c1a59217

2.http://www.cnblogs.com/ThankForYou/archive/2012/09/12/2681739.html



你可能感兴趣的:(iOS 将Log日志输出到文件中保存)