异常日志记录 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 ...
随机推荐
- 20180831_jar包冲突2_天安微信httpclient冲突
一.异常现象 微信项目需要向腾讯服务器发送请求获取token. 但是在请求的时候抛了个异常: <2018-8-30 下午05时39分18秒 CST> <Notice> < ...
- LeetCode OJ:Kth Smallest Element in a BST(二叉树中第k个最小的元素)
Given a binary search tree, write a function kthSmallest to find the kth smallest element in it. Not ...
- 剑指offer--4.斐波那契数列
int最大范围(有符号情况下,从第0项0开始)能取到第46项1836311903,47项溢出 时间限制:1秒 空间限制:32768K 热度指数:473928 题目描述 大家都知道斐波那契数列,现在要求 ...
- MBA 工商管理课程-风险型决策方法
(二)风险型决策方法 适用的条件 未来情况不止一种,管理者不知道到底哪种情况会发生,但知道每种情况发生的概率 常用方法: ...
- Codeforces Round #271 (Div. 2)D(递推,前缀和)
很简单的递推题.d[n]=d[n-1]+d[n-k] 注意每次输入a和b时,如果每次都累加,就做了很多重复性工作,会超时. 所以用预处理前缀和来解决重复累加问题. 最后一个细节坑了我多次: print ...
- Express+Mongoose(MongoDB)+Vue2全栈微信商城项目全记录(一)
最近用vue2做了一个微信商城项目,因为做的比较仓促,所以一边写一下整个流程,一边稍做优化. 项目github地址:https://github.com/seven9115/vue-fullstack ...
- Apache POI实现excel导出
链接:http://poi.apache.org/ Excel数据导出步骤: 使用poi 完成账户数据的导出功能 导入poi jar包并添加到classpath中 1.查询数据 2.定义导出头 St ...
- 如何上Chrome谷歌商店
将以下代码复制到本地Hosts中即可. #Google Services START64.233.162.83 0.docs.google.com64.233.162.83 0.drive.googl ...
- Logstash详解之——input模块
原文地址 Logstash由三个组件构造成,分别是input.filter以及output.我们可以吧Logstash三个组件的工作流理解为:input收集数据,filter处理数据,output输出 ...
- MYSQLdump参数详解(转)
mysqldump客户端可用来转储数据库或搜集数据库进行备份或将数据转移到另一个SQL服务器(不一定是一个MySQL服务器).转储包含创建表和/或装载表的SQL语句. 如果你在服务器上进行备份,并且表 ...