實(shí)際開(kāi)發(fā)測(cè)試中滞乙,經(jīng)常出現(xiàn)測(cè)試提交的問(wèn)題或反饋在開(kāi)發(fā)端不能復(fù)現(xiàn)的問(wèn)題蚓聘,通常都是Xcode聯(lián)調(diào)打印日志去排查,而且打印信息可能不具體京髓,所以想到了宏定義NSLog打印更多信息航缀,并且輸出到日志中,直接可以從設(shè)備上拿到日志去分析堰怨,基于以上要求芥玉,測(cè)試完成了一下功能希望能幫助需要的人、
主要分為兩步操作
-
一.自定義輸出
在pch文件中添加以便我們?cè)谡麄€(gè)項(xiàng)目中都是使用诚些,代碼如下
#ifdef DEBUG
# define GALLog(fmt, ...) NSLog((@"[路徑:%s]\n" "[函數(shù)名:%s]\n" "[行號(hào):%d] \n" fmt), [[NSString stringWithFormat:@"%s", __FILE__].lastPathComponent UTF8String], __FUNCTION__, __LINE__, ##__VA_ARGS__);
#else
# define GALLog(fmt,...) NSLog(@"" fmt);
//# define GALLog(...);
#endif
名詞解釋:
宏 說(shuō)明
func 打印當(dāng)前函數(shù)或方法飞傀,c字符串
LINE 打印當(dāng)前行號(hào),整數(shù)
FILE 打印當(dāng)前文件路徑诬烹,c字符串
FUNCTION 打印當(dāng)前函數(shù)或方法(在C++中會(huì)包含參數(shù)類型)砸烦,c字符串
舉例:
在viewDidLoad中使用自定義的 GALLog(@"123"); 打印信息如圖非常詳細(xì)。
- 二.將日志寫入文件
這一步也非常簡(jiǎn)單绞吁,只需要在AppDelegate.m的didFinishLaunchingWithOptions 中調(diào)用以下方法即可幢痘。
具體代碼給出如下:
#pragma mark - 日志收集
- (void)redirectNSlogToDocumentFolder
{
NSString *documentDirectory = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0];
NSDateFormatter *dateformat = [[NSDateFormatter alloc]init];
[dateformat setDateFormat:@"yyyy-MM-dd-HH-mm-ss"];
NSString *fileName = [NSString stringWithFormat:@"LOG-%@.txt",[dateformat stringFromDate:[NSDate date]]];
NSString *logFilePath = [documentDirectory stringByAppendingPathComponent:fileName];
// 先刪除已經(jīng)存在的文件
NSFileManager *defaultManager = [NSFileManager defaultManager];
[defaultManager removeItemAtPath:logFilePath error:nil];
NSLog(@"%@",logFilePath);
// 將log輸入到文件
freopen([logFilePath cStringUsingEncoding:NSASCIIStringEncoding], "a+", stdout);
freopen([logFilePath cStringUsingEncoding:NSASCIIStringEncoding], "a+", stderr);
}
最終可以在指定的logFilePath中拿到日志如圖:
重點(diǎn)在于 - freopen
freopen()函數(shù)用于文件流的的重定向,一般是將 stdin家破、stdout 和 stderr 重定向到文件颜说。
所謂重定向,就是改變文件流的源頭或目的地汰聋。stdout(標(biāo)準(zhǔn)輸出流)的目的地是顯示器门粪,printf()是將流中的內(nèi)容輸出到顯示器;可以通過(guò)freopen()將stdout 的目的地改為一個(gè)文件(如output.txt)烹困,再調(diào)用 printf()玄妈,就會(huì)將內(nèi)容輸出到這個(gè)文件里面,而不是顯示器。 freopen()函數(shù)的原型為: FILE *freopen(char *filename, char *type, FILE *stream);
這里通過(guò)這個(gè)方法就可以將前面我們打印在控制臺(tái)的信息全部寫去到文件中去拟蜻,可以通過(guò)設(shè)備直接拿到日志文件去分析绎签。
注意
通過(guò)以上兩步就可以實(shí)現(xiàn)前面所要求的功能,有幾點(diǎn)需要注意的在這里提及一下酝锅;
1.這里所寫的宏定義輸出是在DEBUG模式下可用的诡必,在release模式下我這里還是系統(tǒng)的NSLog輸出,使用時(shí)可以自己調(diào)整搔扁。
上面的#if #endif宏定義就是如果定義了DEBUG,那么就使用GALLog輸出;否則這段代碼就直接忽略不執(zhí)行.這個(gè)Xcode的默認(rèn)設(shè)置,我們可以取消DEBUG模式,開(kāi)啟RELEASE發(fā)布模式,如下面的截圖所示.
選擇Product->Scheme->Edit Scheme
2.如果debug模式下在AppDelegate.m的didFinishLaunchingWithOptions 中調(diào)用了redirectNSlogToDocumentFolder爸舒,那么Xcode控制臺(tái)是不會(huì)打印的,打印信息會(huì)全部寫入日志文件中阁谆,所以這里使用的時(shí)候需要注意碳抄。
3.拿到的日志我們可以通過(guò)接口定期上傳到我們自己的服務(wù)器愉老。