项目中如果想把异常捕获再写入文件,有个十分容易使用的库DDLog.

首先导入库,在git上下载。

一:在项目初始化指定全局LogLeve ,一般在xxxapp.m中

staticconstint ddLogLevel = LOG_LEVEL_VERBOSE;

二:

 - (void)applicationDidFinishLaunching:(NSNotification *)aNotification
{
NSExceptionHandler *exceptionHandler = [NSExceptionHandler defaultExceptionHandler] ;
exceptionHandler.delegate = self;
exceptionHandler.exceptionHandlingMask = NSLogAndHandleEveryExceptionMask; DBSDDFileLogger *fileLogger = [[DBSDDFileLogger alloc] init];
fileLogger.maximumFileSize = ; // 1024*1 KB
fileLogger.rollingFrequency = ; // 60*60*60 Seconds
fileLogger.logFileManager.maximumNumberOfLogFiles = ;
[DDLog addLogger:fileLogger];
}
- (BOOL)exceptionHandler:(NSExceptionHandler *)sender shouldLogException:(NSException *)exception mask:(unsigned int)mask
{
[self printStackTrace:exception];
return YES;
}
- (void)printStackTrace:(NSException *)e//要写入log文件的信息
{
NSString *stack = [[e userInfo] objectForKey:NSStackTraceKey];
NSMutableArray *args = [NSMutableArray arrayWithCapacity:];
if (stack) {
NSTask *ls = [[NSTask alloc] init];
NSString *pid = [[NSNumber numberWithInt:[[NSProcessInfo processInfo] processIdentifier]] stringValue];
[args addObject:@"-p"];//-p
[args addObject:pid];
[args addObjectsFromArray:[stack componentsSeparatedByString:@" "]];
// Note: function addresses are separated by double spaces, not a single space.
[ls setLaunchPath:@"/usr/bin/atos"];//xcrun atos
[ls setArguments:args];
// [ls launch];
NSPipe *pipe;
pipe = [NSPipe pipe];
[ls setStandardOutput: pipe];
NSFileHandle *file;
file = [pipe fileHandleForReading];
[ls launch];
NSData *data;
data = [file readDataToEndOfFile];
NSString *string;
string = [[NSString alloc] initWithData: data
encoding: NSUTF8StringEncoding];
NSString *strFormat = [NSString stringWithFormat:@"\n\n*************************exception begin\nexception time: %@\n%@\n*************************exception end\n\n",[NSDate date] ,string];
DDLogCError(strFormat); } else {
DDLogCError(@"No stack trace available.");
}
}

三 。两个自定义类。这里的DBSDDFileLogger继承于DDFileLogger,目的在于自定义log文件的路径。如下:

#import "DBSDDFileLogger.h"
#import "DBSDDLogFileManagerDefault.h"
#define DBSLogDir @"DBstudio/Files/Logs"
@implementation DBSDDFileLogger
- (id)init{
DBSDDLogFileManagerDefault *defaultLogFileManager = [[DBSDDLogFileManagerDefault alloc] initWithLogsDirectory:[self getDBSCacheLogsDir]];
return [self initWithLogFileManager:defaultLogFileManager];
}
- (NSString*)getDBSCacheLogsDir{
NSString *dir = [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES)objectAtIndex:];
NSString *cachedLogDir=[dir stringByAppendingPathComponent:DBSLogDir];
return cachedLogDir;
}

DBSDDLogFileManagerDefault 继承自  DDLogFileManagerDefault 目的在于自定义log文件的路径

@implementation DBSDDLogFileManagerDefault
- (NSString *)generateShortUUID{ NSDate *date = [[NSDate alloc] init];
NSDateFormatter *threadUnsafeDateFormatter = [[NSDateFormatter alloc] init];
[threadUnsafeDateFormatter setFormatterBehavior:NSDateFormatterBehavior10_4];
NSString *dateFormatString = @"yyyy-MM-dd";
[threadUnsafeDateFormatter setDateFormat:dateFormatString];
NSString *filename = [threadUnsafeDateFormatter stringFromDate:date];
return filename;
}
- (NSString *)createNewLogFile{
NSString *logsDirectory = [self logsDirectory];
int index = ;
NSString *fileName = [NSString stringWithFormat:@"dbs-log-%@.txt", [self generateShortUUID]];
do
{
NSString *filePath = [logsDirectory stringByAppendingPathComponent:fileName]; if (![[NSFileManager defaultManager] fileExistsAtPath:filePath])
{
[[NSFileManager defaultManager] createFileAtPath:filePath contents:nil attributes:nil];
// Since we just created a new log file, we may need to delete some old log files
[super deleteOldLogFiles];
NSLog(@"create file:%@",fileName);
return filePath;
}
else
{
NSString *strFile = [filePath stringByDeletingPathExtension];
NSString *strFileName = [strFile lastPathComponent];
NSString *strFileNameFormat = [self isContainCharacter:strFileName];
if (strFileNameFormat) {
strFileName = strFileNameFormat;
}
fileName =[NSString stringWithFormat:@"%@(%d).%@",strFileName,index,[filePath pathExtension]];
index++;
}
} while(YES);
} - (NSString*)isContainCharacter:(NSString*)fileName{
NSString *strCharachter = @"(";
NSRange foundPer=[fileName rangeOfString:strCharachter options:NSCaseInsensitiveSearch];
if(foundPer.length>) {
NSRange rang;
rang.location = ;
rang.length = foundPer.location;
NSString *strRes = [fileName substringWithRange:rang];
return strRes;
}
else {
return nil;
}
} - (BOOL)isLogFile:(NSString *)fileName{
if (fileName && [fileName length]>) {
NSRange rang;
rang.location = [fileName length] - ;
rang.length = ;
NSString *strTmpName = [fileName substringWithRange:rang];
if ([strTmpName isEqualToString:@".txt"]) {
rang.location = ;
rang.length = ;
strTmpName = [fileName substringWithRange:rang];
if ([@"dbs-" isEqualToString:strTmpName]) {
return YES;
}
}
}
return NO;
}

好了,test一下

- (IBAction)test:(id)sender {
//@try {
NSMutableArray *array = [NSMutableArray array];
[array addObject:nil];
//}
//@catch (NSException *exception) {
//@throw exception;
//}
//@finally { //}
}

DDLogger比较强悍的地方是可以记录所有异常,包括你catch了的。

异常日志记录 DDLog的更多相关文章

  1. Log4Net异常日志记录在asp.net mvc3.0的应用

    前言 log4net是.Net下一个非常优秀的开源日志记录组件.log4net记录日志的功能非常强大.它可以将日志分不同的等级,以不同的格式,输出到不同的媒介.本文主要是简单的介绍如何在Visual ...

  2. Log4Net异常日志记录在asp.net mvc3.0的应用(转载)

    这篇博客写的很好:http://www.cnblogs.com/qianlifeng/archive/2011/04/22/2024856.html 前言 log4net是.Net下一个非常优秀的开源 ...

  3. IOS异常日志记录与展现功能

    在平常的APP开发过程中经常碰到程序遇到异常闪退的问题,通过日志可以把相关的详细错误信息进行记录,本实例要记录不管在哪个页面出错都要进行记录,这边使用到的日志记录插件CocoaLumberjack,以 ...

  4. ASP.NET全局错误处理和异常日志记录以及IIS配置自定义错误页面

    应用场景和使用目的 很多时候,我们在访问页面的时候,由于程序异常.系统崩溃会导致出现黄页.在通常的情况下,黄页对于我们来说,帮助是极大的,因为它可以帮助我们知道问题根源,甚至是哪一行代码出现了错误.但 ...

  5. 从壹开始前后端分离 [.netCore 不定期更新 ] 三十五║ 完美实现全局异常日志记录

    缘起 哈喽我是不定期更新的日常,昨天群里小伙伴问到了记录日志,当然,以前我也挖过这个坑,后来一直没有来得及填上,也想着 swagger 一直又有错误信息展示的功能,就迟迟没有添加这个功能,不过昨天夜里 ...

  6. OneAPM大讲堂 | Java 异常日志记录最佳实践

    [编者按]本文作者是 Casey Dunham.Casey 是一位具有 10 多年经验的专业软件开发人员,以其独特的方式应对应用安全问题而闻名.本文系国内 ITOM 管理平台 OneAPM 工程师编译 ...

  7. 转:使用log4net完成程序异常日志记录(使用SQLite数据库记录和普通文本记录)

    http://www.cnblogs.com/kyo-yo/archive/2010/06/11/use-log4net-to-log-exception.html 在前端时间开发的时候由于需要将异常 ...

  8. ASP.NET Web API 异常日志记录

    如果在 ASP.NET MVC 应用程序中记录异常信息,我们只需要在 Global.asax 的 Application_Error 中添加代码就可以了,比如: public class MvcApp ...

  9. python中用修饰器进行异常日志记录

    当脚本中需要进行的的相同的异常操作很多的时候,可以用修饰器来简化代码.比如我需要记录抛出的异常: 在log_exception.py文件中, import functools import loggi ...

随机推荐

  1. HihoCoder1078线段树的区间修改(线段树+lazy)

    每个测试点(输入文件)有且仅有一组测试数据. 每组测试数据的第1行为一个整数N,意义如前文所述. 每组测试数据的第2行为N个整数,分别描述每种商品的重量,其中第i个整数表示标号为i的商品的重量Pi. ...

  2. HDFS超租约异常总结(org.apache.hadoop.hdfs.server.namenode.LeaseExpiredException)

    HDFS超租约异常总结(org.apache.hadoop.hdfs.server.namenode.LeaseExpiredException) 转载 2014年02月22日 14:40:58 96 ...

  3. 《Javascript高级程序设计》阅读记录(七):第七章

    <Javascript高级程序设计>中,2-7章中已经涵盖了大部分精华内容,所以摘录到博客中,方便随时回忆.本系列基本完成,之后的章节,可能看情况进行摘录. 这个系列以往文字地址: < ...

  4. 【LeetCode】002 Add Two Numbers

    题目: You are given two non-empty linked lists representing two non-negative integers. The digits are ...

  5. Android UI--提高Android UI体验

    1,自定义虚拟键盘 当一个用户被要求在一个文本框输入时希望又怎样的体验?  从用户需求来看,虚拟键盘应该改变以帮助用户输入的数据.这里是一些例子: 如果一个视图是一个电子邮件地址,一个键盘的“@”符号 ...

  6. MariaDB10.1找回密码

    C:\Program Files\MariaDB 10.1\data下面的my.ini文件,在[mysqld]节点下,增加一句: skip-grant-tables  重启MariaDB服务(mysq ...

  7. 五、Jmeter--关联(正则表达式)

    一.什么时候需要关联? 1. 服务器返回的动态变化而且对业务有影响的需要关联. 2. 回放脚本看是否正确,检查下脚本,是否有动态数据影响 3. 一大串字符串,每次请求参数是否有变化 4. 可以找开发问 ...

  8. CentOS6.8部署MongoDB集群及支持auth认证

    三个节点的副本集如下图所示: 实验目的: 配置MongoDB的3节点副本集 3个节点的副本集都要开启auth认证,并且开启认证后,能互相通信 第一步 - 准备环境 准备三个虚拟机,其中一个用作Prim ...

  9. Verilog数组表示及初始化

    (转)Verilog数组表示及初始化 这里的内存模型指的是内存的行为模型.Verilog中提供了两维数组来帮助我们建立内存的行为模型.具体来说,就是可以将内存宣称为一个reg类型的数组,这个数组中的任 ...

  10. MySQL insert插入

    使用INSERT语句插入新数据 语法:INSERT [INTO] tbl_name [(col_name,...)] VALUES (pression,...),…      INSERT [INTO ...