异常日志记录 DDLog
项目中如果想把异常捕获再写入文件,有个十分容易使用的库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的更多相关文章
- Log4Net异常日志记录在asp.net mvc3.0的应用
前言 log4net是.Net下一个非常优秀的开源日志记录组件.log4net记录日志的功能非常强大.它可以将日志分不同的等级,以不同的格式,输出到不同的媒介.本文主要是简单的介绍如何在Visual ...
- Log4Net异常日志记录在asp.net mvc3.0的应用(转载)
这篇博客写的很好:http://www.cnblogs.com/qianlifeng/archive/2011/04/22/2024856.html 前言 log4net是.Net下一个非常优秀的开源 ...
- IOS异常日志记录与展现功能
在平常的APP开发过程中经常碰到程序遇到异常闪退的问题,通过日志可以把相关的详细错误信息进行记录,本实例要记录不管在哪个页面出错都要进行记录,这边使用到的日志记录插件CocoaLumberjack,以 ...
- ASP.NET全局错误处理和异常日志记录以及IIS配置自定义错误页面
应用场景和使用目的 很多时候,我们在访问页面的时候,由于程序异常.系统崩溃会导致出现黄页.在通常的情况下,黄页对于我们来说,帮助是极大的,因为它可以帮助我们知道问题根源,甚至是哪一行代码出现了错误.但 ...
- 从壹开始前后端分离 [.netCore 不定期更新 ] 三十五║ 完美实现全局异常日志记录
缘起 哈喽我是不定期更新的日常,昨天群里小伙伴问到了记录日志,当然,以前我也挖过这个坑,后来一直没有来得及填上,也想着 swagger 一直又有错误信息展示的功能,就迟迟没有添加这个功能,不过昨天夜里 ...
- OneAPM大讲堂 | Java 异常日志记录最佳实践
[编者按]本文作者是 Casey Dunham.Casey 是一位具有 10 多年经验的专业软件开发人员,以其独特的方式应对应用安全问题而闻名.本文系国内 ITOM 管理平台 OneAPM 工程师编译 ...
- 转:使用log4net完成程序异常日志记录(使用SQLite数据库记录和普通文本记录)
http://www.cnblogs.com/kyo-yo/archive/2010/06/11/use-log4net-to-log-exception.html 在前端时间开发的时候由于需要将异常 ...
- ASP.NET Web API 异常日志记录
如果在 ASP.NET MVC 应用程序中记录异常信息,我们只需要在 Global.asax 的 Application_Error 中添加代码就可以了,比如: public class MvcApp ...
- python中用修饰器进行异常日志记录
当脚本中需要进行的的相同的异常操作很多的时候,可以用修饰器来简化代码.比如我需要记录抛出的异常: 在log_exception.py文件中, import functools import loggi ...
随机推荐
- C# GDI+编程
窗口刷新的时候,会产生Paint事件,那么我们给这个事件添加一个处理函数.然后在这个函数里画图.就能保证所画的图不被刷新掉, 它可以总是显示.Paint事件对应的委托是:public delegate ...
- UVA - 11925 Generating Permutations (思维,构造)
给你一个长度为n(n<=300)的排列,有两种操作,第一种是交换前两个数,第二种是把第一个数放到最后,让你用不超过2n^2次的操作把一个初始为1-n升序的排列变为该排列. 一开始被紫薯蛋疼的翻译 ...
- WPF之X名称空间学习
WPF的X名称空间都有什么呢?首先,盗用张图来说明: 我将就图表中的内容进行总结: 1.x:Array具有一个Iteams属性,它能暴漏一个ArratList实例,ArratList实例的内部成员类型 ...
- 2017.10.7北京清北综合强化班DAY7
1.计数 (count.cpp/c/pas) 时间限制:1s 内存限制:256MB [问题描述] 给出m个数a[1],a[2],…,a[m] 求1~n中有多少数不是a[1],a[2],…,a[m]的倍 ...
- 5.7 Windows常用网络命令
5.7 Windows常用网络命令 •ping •netstat •winipcfg/ipconfig •tracert •route 5.7.1 ping命令 •功能 –它是用来检查网络是否通畅或者 ...
- ubuntu nfs server config
(1)#sudo apt-get install nfs-kernel-server 打开/etc/exports文件,在末尾加入: /home/hyq *(rw,sync,no_root_squas ...
- 扒站工具Teleport Pro教程
1.下载软件 http://www.jb51.net/softs/44134.html 2.安装 3.界面 先点开帮助点注册(类似于破解要不全站扒不全) 下面请看ppt, http://www.doc ...
- 引用com.sencha.gxt.ui.GXT加载错误解决方案
环境GWT2.7+GXT4.0 <inherits name='com.sencha.gxt.ui.GXT' /> 出现加载错误 Loading inherited module 'com ...
- 转:三思!大规模MySQL运维陷阱之基于MyCat的伪分布式架构
在微信公众号看到一篇关于mycat的文章,觉得分析的很不错,给大家分享一下 三思!大规模MySQL运维陷阱之基于MyCat的伪分布式架构 原文链接:https://mp.weixin.qq.com/s ...
- 基于OpenCV的火焰检测(一)——图像预处理
博主最近在做一个基于OpenCV的火焰检测的项目,不仅可以检测图片中的火焰,还可以检测视频中的火焰,最后在视频检测的基础上推广到摄像头实时检测.在做这个项目的时候,博主参考了很多相关的文献,用了很多种 ...