-(void)saveDEBUGlog{ NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); NSString *documentDirectory = [paths objectAtIndex:0]; NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init]; [dateFormatter setDateFormat:@"yyyy_MM_dd_HH_mm_ss"]; NSString *currentDateStr = [dateFormatter stringFromDate:[NSDate date]]; NSString *fileName = [NSString stringWithFormat:@"testLog_%@.log",currentDateStr]; NSString *logFilePath = [documentDirectory stringByAppendingPathComponent:fileName]; // 先刪除已經(jīng)存在的文件 NSFileManager *defaultManager = [NSFileManager defaultManager]; [defaultManager removeItemAtPath:logFilePath error:nil]; // 將log輸入到文件 freopen([logFilePath cStringUsingEncoding:NSASCIIStringEncoding], "a+", stdout); freopen([logFilePath cStringUsingEncoding:NSASCIIStringEncoding], "a+", stderr);}
這個(gè)方法主要是調(diào)用 freopen 這個(gè)方法來(lái)寫(xiě)入, 其中 stdout 和 stderr 囊括了 iOS 大部分的異常輸出。
2. 根據(jù) Bool 值控制 log 輸出
用戶在使用 app 遇到各種各樣的問(wèn)題,當(dāng)自己以及測(cè)試團(tuán)隊(duì)不好定位原因的時(shí)候,能將用戶把關(guān)鍵點(diǎn)的 log 發(fā)送過(guò)來(lái)是最好的分析方法了。但是如何將 app 運(yùn)行過(guò)程中的 log 截取一部分保存呢?像開(kāi)關(guān)一樣能夠控制 log 的讀寫(xiě)呢?通過(guò)閱讀 MQTTLog 源碼發(fā)現(xiàn)獲得的靈感。
首先對(duì) NSLog 進(jìn)行下宏替換,項(xiàng)目中統(tǒng)一使用 SLOG 來(lái)進(jìn)行輸出
#define SLOG(fmt, ...) if (reportLoggerIsOpen) NSLog((@"%s [Line %d] " fmt), __PRETTY_FUNCTION__, __LINE__, ##__VA_ARGS__)
從宏定義可以看出,reportLoggerIsOpen 是控制 Log 輸出的開(kāi)關(guān),對(duì)于reportLoggerIsOpen的定義,在 h 文件中先 extern 聲明這個(gè)變量,然后再 m 文件中去實(shí)現(xiàn)。
.h 文件
#import <Foundation/Foundation.h>extern BOOL reportLoggerIsOpen;.m 文件BOOL reportLoggerIsOpen = NO;+ (void)setLogOpen:(BOOL)open { reportLoggerIsOpen = open;}
通過(guò) setLogOpen 這個(gè)方法,就能夠收放自如的控制日志寫(xiě)入了。比如你需要抓取登錄模塊的日志,那么就在登錄前傳入 true,登錄完畢后,傳入 false,即可只保留登錄模塊的日志了。
新聞熱點(diǎn)
疑難解答
圖片精選
網(wǎng)友關(guān)注