iOS日志收集:宏定義NSLog并寫入日志中

實(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)用以下方法即可幢痘。


20180517161953389.png

具體代碼給出如下:

#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中拿到日志如圖:


屏幕快照 2018-05-17 下午4.42.54.png

重點(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

  

A34941E7-3E6D-425D-A93A-F0158845902D.png

2.如果debug模式下在AppDelegate.m的didFinishLaunchingWithOptions 中調(diào)用了redirectNSlogToDocumentFolder爸舒,那么Xcode控制臺(tái)是不會(huì)打印的,打印信息會(huì)全部寫入日志文件中阁谆,所以這里使用的時(shí)候需要注意碳抄。
3.拿到的日志我們可以通過(guò)接口定期上傳到我們自己的服務(wù)器愉老。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末场绿,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子嫉入,更是在濱河造成了極大的恐慌焰盗,老刑警劉巖,帶你破解...
    沈念sama閱讀 221,273評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件咒林,死亡現(xiàn)場(chǎng)離奇詭異熬拒,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)垫竞,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,349評(píng)論 3 398
  • 文/潘曉璐 我一進(jìn)店門澎粟,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人欢瞪,你說(shuō)我怎么就攤上這事活烙。” “怎么了遣鼓?”我有些...
    開(kāi)封第一講書(shū)人閱讀 167,709評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵啸盏,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我骑祟,道長(zhǎng)回懦,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 59,520評(píng)論 1 296
  • 正文 為了忘掉前任次企,我火速辦了婚禮怯晕,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘缸棵。我一直安慰自己舟茶,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,515評(píng)論 6 397
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著稚晚,像睡著了一般崇堵。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上客燕,一...
    開(kāi)封第一講書(shū)人閱讀 52,158評(píng)論 1 308
  • 那天鸳劳,我揣著相機(jī)與錄音,去河邊找鬼也搓。 笑死赏廓,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的傍妒。 我是一名探鬼主播幔摸,決...
    沈念sama閱讀 40,755評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼颤练!你這毒婦竟也來(lái)了既忆?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 39,660評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤嗦玖,失蹤者是張志新(化名)和其女友劉穎患雇,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體宇挫,經(jīng)...
    沈念sama閱讀 46,203評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡苛吱,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,287評(píng)論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了器瘪。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片翠储。...
    茶點(diǎn)故事閱讀 40,427評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖橡疼,靈堂內(nèi)的尸體忽然破棺而出援所,到底是詐尸還是另有隱情,我是刑警寧澤衰齐,帶...
    沈念sama閱讀 36,122評(píng)論 5 349
  • 正文 年R本政府宣布任斋,位于F島的核電站,受9級(jí)特大地震影響耻涛,放射性物質(zhì)發(fā)生泄漏废酷。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,801評(píng)論 3 333
  • 文/蒙蒙 一抹缕、第九天 我趴在偏房一處隱蔽的房頂上張望澈蟆。 院中可真熱鬧,春花似錦卓研、人聲如沸趴俘。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,272評(píng)論 0 23
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)寥闪。三九已至太惠,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間疲憋,已是汗流浹背凿渊。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,393評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留缚柳,地道東北人趾代。 一個(gè)月前我還...
    沈念sama閱讀 48,808評(píng)論 3 376
  • 正文 我出身青樓轨功,卻偏偏與公主長(zhǎng)得像被饿,于是被迫代替她去往敵國(guó)和親医咨。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,440評(píng)論 2 359

推薦閱讀更多精彩內(nèi)容

  • 官網(wǎng) 中文版本 好的網(wǎng)站 Content-type: text/htmlBASH Section: User ...
    不排版閱讀 4,401評(píng)論 0 5
  • From:Python之日志處理(logging模塊) - 云游道士 - 博客園 https://www.cnbl...
    vigny的先生閱讀 2,687評(píng)論 3 5
  • 在應(yīng)用程序中添加日志記錄總的來(lái)說(shuō)基于三個(gè)目的:監(jiān)視代碼中變量的變化情況灰追,周期性的記錄到文件中供其他應(yīng)用進(jìn)行統(tǒng)計(jì)分析...
    時(shí)待吾閱讀 5,055評(píng)論 1 13
  • 在應(yīng)用程序中添加日志記錄總的來(lái)說(shuō)基于三個(gè)目的:監(jiān)視代碼中變量的變化情況堵幽,周期性的記錄到文件中供其他應(yīng)用進(jìn)行統(tǒng)計(jì)分析...
    時(shí)待吾閱讀 4,991評(píng)論 0 6
  • [這是第9篇] 導(dǎo)語(yǔ): 日志輸出不僅僅是NSLog的簡(jiǎn)單使用,它對(duì)定位開(kāi)發(fā)中的問(wèn)題监嗜,收集用戶的使用習(xí)慣有著很重要的...
    南華coder閱讀 2,495評(píng)論 0 30