iOS Log打印

簡(jiǎn)述

iOS調(diào)試中打印日志是一種比較常見的手段,一般都是使用系統(tǒng)的打印日志的方法NSLog,但是這種打印日志的方法打印的內(nèi)容比較單一(如下),以時(shí)間開頭,然后是項(xiàng)目名,中括號(hào)里面的數(shù)字沒搞懂啥意思??,最后就是打印的內(nèi)容了。
2017-01-09 14:57:09.247 LYLogTest[4170:156374] System Log
而且還有一個(gè)問題,這個(gè)打印日志的方法不管是debug模式還是release模式下都會(huì)打印出來,同時(shí)NSLog的輸出還是比較消耗系統(tǒng)資源的(NSLog耗內(nèi)存原因),所以調(diào)試時(shí)候加上的NSLog都需要注釋掉,想想算是一個(gè)無聊而且耗時(shí)的事情。

改進(jìn)方法

改進(jìn)方法網(wǎng)上有很多,總體思路都一樣,自定義NSLog解決日志內(nèi)容過于簡(jiǎn)單的問題,使用debug/release不同模式下的宏來區(qū)分當(dāng)前屬于哪個(gè)模式(例如DEBUG)

  • 自定義NSLog
    可以使用如下宏豐富日志內(nèi)容:
    1.__VA_ARGS__ 是一個(gè)可變參數(shù)的宏,這個(gè)可變參數(shù)的宏是新的C99規(guī)范中新增的,目前似乎只有g(shù)cc支持(VC6.0的編譯器不支持)。宏前面加上##的作用在于,當(dāng)可變參數(shù)的個(gè)數(shù)為0時(shí),這里的##起到把前面多余的","去掉,否則會(huì)編譯出錯(cuò)。
    1. __FILE__ 宏在預(yù)編譯時(shí)會(huì)替換成當(dāng)前的源文件名
    2. __LINE__宏在預(yù)編譯時(shí)會(huì)替換成當(dāng)前的行號(hào)
    3. __FUNCTION__宏在預(yù)編譯時(shí)會(huì)替換成當(dāng)前的函數(shù)名稱

我使用的自定義NSLog如下,在原來的基礎(chǔ)上添加了打印log所在的函數(shù)和行數(shù),沒有添加太多,不然日志log會(huì)過于臃腫。

#define NSLog(FORMAT, ...) NSLog(@"LOG >> Function:%s Line:%d Content:%@\n", __FUNCTION__, __LINE__, [NSString stringWithFormat:FORMAT, ##__VA_ARGS__])

我有時(shí)候打印日志需要打印的時(shí)間,所以在原有基礎(chǔ)上追加新的打印內(nèi)容,當(dāng)然你也可以使用fprintf()函數(shù)重新一個(gè)新的打印日志的宏(全部重新寫的話,有信息不容易獲取,例如時(shí)間,需要用代碼獲取,所以我在系統(tǒng)NSLog上追加了),下面是一個(gè)重寫的DLog:

#define DLog(FORMAT, ...) fprintf(stderr,"\nFunction:%s Line:%d Content:%s\n", __FUNCTION__, __LINE__, [[NSString stringWithFormat:FORMAT, ##__VA_ARGS__] UTF8String])
  • 添加日志打印的開關(guān)
    DEBUG是debug模式下默認(rèn)添加的宏,而這個(gè)宏是由"Target > Build Settings > Preprocessor Macros > Debug"里有一個(gè)"DEBUG=1"配置的,可以根據(jù)這個(gè)宏判斷當(dāng)前屬于哪個(gè)模式,可以利用如下代碼在debug模式下打印日志,在release模式下不打?。?/li>
#if DEBUG
#define NSLog(FORMAT, ...) NSLog(@"LOG >> Function:%s Line:%d Content:%@\n", __FUNCTION__, __LINE__, [NSString stringWithFormat:FORMAT, ##__VA_ARGS__])
#else
#define NSLog(FORMAT, ...)
#endif

你可以在Product->Scheme->Edit Scheme里面設(shè)置Build Configuration實(shí)現(xiàn)debug模式/release模式的切換:

模式切換

上面說到宏DEBUG是由"Target > Build Settings > Preprocessor Macros > Debug"里的"DEBUG=1"配置的,不知道可不可以換成別的,可以試試看。

補(bǔ)充一句:debug模式/release模式切換后或者求改了宏判斷里面的代碼后最好clean一下,不然可能會(huì)崩潰!我遇到過好多次!不解釋!因?yàn)槲乙膊恢罏樯叮??

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容