異常日誌記錄 DDLog

項目中若是想把異常捕獲再寫入文件,有個十分容易使用的庫DDLog.git

首先導入庫,在git上下載。app

一:在項目初始化指定全局LogLeve ,通常在xxxapp.m中spa

staticconstint ddLogLevel = LOG_LEVEL_VERBOSE;code

二:component

 - (void)applicationDidFinishLaunching:(NSNotification *)aNotification
{
    NSExceptionHandler *exceptionHandler = [NSExceptionHandler defaultExceptionHandler] ;
    exceptionHandler.delegate = self;
    exceptionHandler.exceptionHandlingMask = NSLogAndHandleEveryExceptionMask;
    
    DBSDDFileLogger *fileLogger = [[DBSDDFileLogger alloc] init];
    fileLogger.maximumFileSize = 1;  //  1024*1 KB
    fileLogger.rollingFrequency = 1;       // 60*60*60 Seconds
    fileLogger.logFileManager.maximumNumberOfLogFiles = 4;
    [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:20];
    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文件的路徑。以下:orm

#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:0];
    NSString *cachedLogDir=[dir stringByAppendingPathComponent:DBSLogDir];
    return cachedLogDir;
}

 DBSDDLogFileManagerDefault 繼承自  DDLogFileManagerDefault 目的在於自定義log文件的路徑blog

@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 = 1;
    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>0) {
        NSRange rang;
        rang.location = 0;
        rang.length = foundPer.location;
        NSString *strRes = [fileName substringWithRange:rang];
        return strRes;
    }
    else {
        return nil;
    }
}

- (BOOL)isLogFile:(NSString *)fileName{
    if (fileName && [fileName length]>3) {
        NSRange rang;
        rang.location = [fileName length] - 4;
        rang.length = 4;
        NSString *strTmpName = [fileName substringWithRange:rang];
        if ([strTmpName isEqualToString:@".txt"]) {
            rang.location = 0;
            rang.length = 4;
            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了的。ip

相關文章
相關標籤/搜索