iOS - NSLog、UncaughtException日志保存到文件
转:http://blog.csdn.net/marujunyy/article/details/12005767
对于真机,日志没法保存,不好分析问题。所以有必要将日志保存到应用的Docunment目录下,方便取出分析。
首先是日志输出,分为c的printf和标准的NSLog输出,printf会向标准输出(sedout)打印,而NSLog则是向标准出错(stderr),我们需要同时让他们都将日志打印到一个文件中。 其次是Crash问题;Crash分为两种,一种是由EXC_BAD_ACCESS引起的,原因是访问了不属于本进程的内存地址,有可能是访问已被释放的内存;另一种是未被捕获的Objective-C异常(NSException),导致程序向自身发送了SIGABRT信号而崩溃。其实对于未捕获的Objective-C异常,我们是有办法将它记录下来的,如果日志记录得当,能够解决绝大部分崩溃的问题。
我写了两个函数用于写NSLog日志和Crash日志,这个两个函数都必须在AppDelegate文件中下面的函数里添加
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
- //连接xcode时可以从监视器中看日志 没连接时Log日志会输出到文件中,
- [self redirectNSLogToDocumentFolder];
- - (void)redirectNSLogToDocumentFolder
- {
- //如果已经连接Xcode调试则不输出到文件
- if(isatty(STDOUT_FILENO)) {
- return;
- }
- UIDevice *device = [UIDevice currentDevice];
- if([[device model] hasSuffix:@"Simulator"]){ //在模拟器不保存到文件中
- return;
- }
- //将NSlog打印信息保存到Document目录下的Log文件夹下
- NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
- NSString *logDirectory = [[paths objectAtIndex:0] stringByAppendingPathComponent:@"Log"];
- NSFileManager *fileManager = [NSFileManager defaultManager];
- BOOL fileExists = [fileManager fileExistsAtPath:logDirectory];
- if (!fileExists) {
- [fileManager createDirectoryAtPath:logDirectory withIntermediateDirectories:YES attributes:nil error:nil];
- }
- NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
- [formatter setLocale:[[NSLocale alloc] initWithLocaleIdentifier:@"zh_CN"]];
- [formatter setDateFormat:@"yyyy-MM-dd HH:mm:ss"]; //每次启动后都保存一个新的日志文件中
- NSString *dateStr = [formatter stringFromDate:[NSDate date]];
- NSString *logFilePath = [logDirectory stringByAppendingFormat:@"/%@.log",dateStr];
- // 将log输入到文件
- freopen([logFilePath cStringUsingEncoding:NSASCIIStringEncoding], "a+", stdout);
- freopen([logFilePath cStringUsingEncoding:NSASCIIStringEncoding], "a+", stderr);
- //未捕获的Objective-C异常日志
- NSSetUncaughtExceptionHandler (&UncaughtExceptionHandler);
- }
- void UncaughtExceptionHandler(NSException* exception)
- {
- NSString* name = [ exception name ];
- NSString* reason = [ exception reason ];
- NSArray* symbols = [ exception callStackSymbols ]; // 异常发生时的调用栈
- NSMutableString* strSymbols = [ [ NSMutableString alloc ] init ]; //将调用栈拼成输出日志的字符串
- for ( NSString* item in symbols )
- {
- [ strSymbols appendString: item ];
- [ strSymbols appendString: @"\r\n" ];
- }
- //将crash日志保存到Document目录下的Log文件夹下
- NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
- NSString *logDirectory = [[paths objectAtIndex:0] stringByAppendingPathComponent:@"Log"];
- NSFileManager *fileManager = [NSFileManager defaultManager];
- if (![fileManager fileExistsAtPath:logDirectory]) {
- [fileManager createDirectoryAtPath:logDirectory withIntermediateDirectories:YES attributes:nil error:nil];
- }
- NSString *logFilePath = [logDirectory stringByAppendingPathComponent:@"UncaughtException.log"];
- NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
- [formatter setLocale:[[NSLocale alloc] initWithLocaleIdentifier:@"zh_CN"]];
- [formatter setDateFormat:@"yyyy-MM-dd HH:mm:ss"];
- NSString *dateStr = [formatter stringFromDate:[NSDate date]];
- NSString *crashString = [NSString stringWithFormat:@"<- %@ ->[ Uncaught Exception ]\r\nName: %@, Reason: %@\r\n[ Fe Symbols Start ]\r\n%@[ Fe Symbols End ]\r\n\r\n", dateStr, name, reason, strSymbols];
- //把错误日志写到文件中
- if (![fileManager fileExistsAtPath:logFilePath]) {
- [crashString writeToFile:logFilePath atomically:YES encoding:NSUTF8StringEncoding error:nil];
- }else{
- NSFileHandle *outFile = [NSFileHandle fileHandleForWritingAtPath:logFilePath];
- [outFile seekToEndOfFile];
- [outFile writeData:[crashString dataUsingEncoding:NSUTF8StringEncoding]];
- [outFile closeFile];
- }
- //把错误日志发送到邮箱
- // NSString *urlStr = [NSString stringWithFormat:@"mailto://test@163.com?subject=bug报告&body=感谢您的配合!<br><br><br>错误详情:<br>%@",crashString ];
- // NSURL *url = [NSURL URLWithString:[urlStr stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]];
- // [[UIApplication sharedApplication] openURL:url];
- }
iOS - NSLog、UncaughtException日志保存到文件的更多相关文章
- 【代码笔记】iOS-将log日志保存到文件
代码: #import "AppDelegate.h" #import "RootViewController.h" @implementation AppDe ...
- logstash自己的日志保存到文件中:log4j2.properties
status = error dest = err name = PropertiesConfig property.filename = /gwlog/data/logstash/logs appe ...
- C# log4net 配置及使用详解--日志保存到文件和Access(转)
按语: 最近项目要求选用Access数据库,但日志管理采用log4net,但保存到数据库一直没有成功,后按照如下配置在程序退出时可以成功保存. 开始新建文件应用log4net.dll ,重新编译就报 ...
- ios NSLog常见使用
NSLog常见输出格式 Table 1 Format specifiers supported by the NSString formatting methods and CFString for ...
- 如何将Log4Net 日志保存到mongodb数据库之实践
log4net的大名早有耳闻,一直没真正用过,这次开发APP项目准备在服务端使用log4net. 日志的数据量较大,频繁的写数据库容易影响系统整体性能,所以独立将日志写到mongodb数据库是不错的选 ...
- iOS - NSLog的使用方法
NSLog的定义 NSLog定义在NSObjCRuntime.h中,如下所示: void NSLog(NSString *format, …); 基本上,NSLog很像printf,同样会在conso ...
- IOS NSLog 打印bool值
输出BOOL值的方法:NSLog(@"%@",YES?@"YES":@"NO");%@输出字符串. NSLog(@"ifReadO ...
- iOS NSLog去掉时间戳及其他输出样式
1.一般项目中我的NSLog会在Prefix.pch文件添加如下代码,已保证在非调试状态下NSLog不工作 1 2 3 4 5 #ifdef DEBUG #define NSLog(...) NS ...
- iOS NSLog各种打印
%@ 对象 %d,%i 整型 (%i的老写法) %hd 短整型 %ld , %lld 长整型 %u 无符整型 %f 浮点型和double型 %0.2f 精度浮点数,只保留两位小数 %x: 为32 ...
随机推荐
- hdu 1754 线段树入门
线段树点修改 区间最大值查询 #include <cstdio> #include <cstdlib> #include <cmath> #include < ...
- GCC 静态库和动态库
转自GCC 静态库和动态库 //hello.c #include void print_hello() { printf("HelloWorld "); } //main.c #i ...
- tomcat 解析(五)-Tomcat的核心组成和启动过程
声明:源码版本为Tomcat 6.0.35 前面的文章中介绍了Tomcat的基本配置,每个配置项也基本上对应了Tomcat的组件结构,如果要用一张图来形象展现一下Tomcat组成的话,整个Tomcat ...
- sqlplus 远程oracle
sqlplus dbuser/dbpassword@192.168.0.2/mydb sqlplus try/try@302-4 302-4为本地oralce net manager 配置的网络名
- OneAlert:国内首家 SaaS 模式的云告警平台
随着互联网行业的高速发展,企业 IT 应用环境日趋复杂.几分钟的故障就会严重到用户体验,那么如何有效降低IT故障带来的影响呢?权威数据表明,86%的企业认为建立有效的监控系统和告警系统.提升 IT 的 ...
- Mac OS X 快捷键(完整篇) 转载
转载自:http://www.nooidea.com/2011/01/mac-os-x-keyboard-shortcuts.html 快捷键是通过按下键盘上的组合键来调用 Mac OS X 功能的一 ...
- POJ1144 Network 无向图的割顶
现在打算重新学习图论的一些基础算法,包括像桥,割顶,双连通分量,强连通分量这些基础算法我都打算重敲一次,因为这些量都是可以用tarjan的算法求得的,这次的割顶算是对tarjan的那一类算法的理解的再 ...
- [三分]HDOJ 5531 Rebuild
题意:给n个点,以这n个点为圆心画圆,使得所有的圆与其相邻的圆相切. 求n个圆最小的面积和. 分析:很容易想到确定了其中一个圆的半径之后,其他的圆的半径也能随之确定了. 画一画三个点的和四个点的,会发 ...
- lintcode : 空格替换
题目: 空格替换 设计一种方法,将一个字符串中的所有空格替换成 %20 .你可以假设该字符串有足够的空间来加入新的字符,且你得到的是“真实的”字符长度. 样例 对于字符串"Mr John S ...
- photoshop:多边形选项
你会制作圆滑的五角星吗? 以五边形为例: