NSLog默認(rèn)的輸出格式是"日期-時(shí)間-項(xiàng)目名稱-Debug字符串"竟宋,
例如
2016-11-28 21:06:32.063 Transfrom2016[21582:2973176] MGAccount<0x600000223f80> [age=18, name=Mango]
這是默認(rèn)的日志輸出叨吮,但是信息不夠,通過(guò)日志內(nèi)容我們無(wú)法定位到問(wèn)題發(fā)生的位置昭抒,需求合理就該滿足评也,本篇內(nèi)容想要達(dá)到的效果如下
2016-11-28 22:10:30.168 UIToolbar2016[23025:3024478] -[MGImageCell setModel:] 21 model:MGImageModel<0x6000000314e0> [imageName=icon, title=0]
通過(guò)日志我們可以知道日志是在什么時(shí)間打印的,在什么類的什么方法里面灭返,處于該類的第幾行盗迟,這樣方便我們快速定位。
實(shí)現(xiàn)過(guò)程分為如下幾個(gè)步驟
- 創(chuàng)建一個(gè)pch文件(如果不懂怎么創(chuàng)建可以百度一下)
- 放入下面代碼(貼代碼格式亂了就直接上圖了)
-
在輸入日志的時(shí)候用MGLog(代替NSLog即可熙含。
Snip20161128_73.png
主要用到的是2個(gè)C/C++的宏: __FUNCTION__和__LINE__罚缕,一個(gè)輸出代碼所在的方法,一個(gè)輸出代碼所在的行數(shù)怎静。
核心代碼為下面幾行邮弹,日志打印是很消耗性能的一件事,所以我們可以通過(guò)判斷當(dāng)前版本類型蚓聘,在DEBUG的時(shí)候打印日志腌乡,在發(fā)布的時(shí)候不打印日志。
#ifdef DEBUG
# define MGLog(fmt, ...) NSLog((@"%s %d " fmt), __FUNCTION__, __LINE__, ##__VA_ARGS__);
#else
#define MGLog(...)
#endif
不過(guò)上面的代碼還打印了當(dāng)前工程名字夜牡,感覺(jué)這一個(gè)信息用到的比較少与纽,所以我們可以將上面代碼替換成
#ifdef DEBUG
# define MGLog(FORMAT, ...) fprintf(stderr,"%s %s %s %d %s\n",__DATE__,__TIME__,__FUNCTION__, __LINE__, [[NSString stringWithFormat:FORMAT, ##__VA_ARGS__] UTF8String]);
#else
#define MGLog(...)
#endif
這下子輸出格式如下
Nov 28 2016 22:42:06 -[MGImageCell setModel:] 21 model:MGImageModel<0x60800003b9e0> [imageName=icon, title=5]
不過(guò)時(shí)間沒(méi)有精確到毫秒,這是一個(gè)缺憾塘装,要不干脆定義兩個(gè)日志輸出宏好了急迂,喜歡用哪個(gè)就調(diào)用哪個(gè)。