项目中如果想把异常捕获再写入文件,有个十分容易使用的库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. python编程实例-使用正则收集IP信息

    #!/usr/bin/env python from subprocess import PIPE,Popen import re def getIfconfig(): p = Popen(['ifc ...

  2. 做什么职业,也别做程序员,尤其是Java程序员

    千万别做程序员,尤其别做Java这种门槛低,入门快的程序员(别跟我说Java搞精通了也很牛之类的,原因不解释,做5年以上就知道了),程序员本来就是我见过最坑爹的职业了...Java程序员更是,现在满地 ...

  3. HDU - 1506 Largest Rectangle in a Histogram (单调栈/笛卡尔树)

    题意:求一个直方图中最大矩形的面积. 很经典的一道问题了吧,可以用单调栈分别求出每个柱子左右两边第一个比它低的柱子(也就相当于求出了和它相连的最后一个比它高的柱子),确定每个柱子的左右边界,每个柱子的 ...

  4. BerOS file system

    The new operating system BerOS has a nice feature. It is possible to use any number of characters '/ ...

  5. C# partial 说明(转)

    http://www.cnblogs.com/Echo_saq/archive/2012/11/19/2777058.html 1. 什么是局部类型? C# 2.0 引入了局部类型的概念.局部类型允许 ...

  6. Tomcat 工作原理 1 (转)

    Tomcat 系统架构与设计模式,第 1 部分: 工作原理 这个分为两个部分的系列文章将研究 Apache Tomcat 的系统架构以及其运用的很多经典设计模式.本文是第 1 部分,将主要从 Tomc ...

  7. 非maven项目下载maven的jar

    很多时候我们需要jar,可惜项目不是maven的,但是我们只有一个maven的坐标,那怎么办? 比如: <dependencies> <dependency> <grou ...

  8. bzoj 3527 [Zjoi2014]力——FFT

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3527 把 q[ i ] 除掉.设 g[ i ] = i^2 ,有一半的式子就变成卷积了:另一 ...

  9. LOJ 10189 仓库建设 ——斜率优化dp

    题目:https://loj.ac/problem/10189 #include<iostream> #include<cstdio> #include<cstring& ...

  10. Redis 分布式锁 - 分布式锁的正确实现方式

    前言 分布式锁一般有三种实现方式:1. 数据库乐观锁:2. 基于Redis的分布式锁:3. 基于ZooKeeper的分布式锁.本篇博客将介绍第二种方式,基于Redis实现分布式锁.虽然网上已经有各种介 ...