NSLog默認的輸出格式是"日期-時間-項目名稱-Debug字符串",
例如
2016-11-28 21:06:32.063 Transfrom2016[21582:2973176] MGAccount<0x600000223f80> [age=18, name=Mango]
這是默認的日志輸出,但是信息不夠,通過日志內容我們無法定位到問題發生的位置,需求合理就該滿足,本篇內容想要達到的效果如下
2016-11-28 22:10:30.168 UIToolbar2016[23025:3024478] -[MGImageCell setModel:] 21 model:MGImageModel<0x6000000314e0> [imageName=icon, title=0]
通過日志我們可以知道日志是在什么時間打印的,在什么類的什么方法里面,處于該類的第幾行,這樣方便我們快速定位。
實現過程分為如下幾個步驟
- 創建一個pch文件(如果不懂怎么創建可以百度一下)
- 放入下面代碼(貼代碼格式亂了就直接上圖了)
-
在輸入日志的時候用MGLog(代替NSLog即可。
Snip20161128_73.png
主要用到的是2個C/C++的宏: __FUNCTION__和__LINE__,一個輸出代碼所在的方法,一個輸出代碼所在的行數。
核心代碼為下面幾行,日志打印是很消耗性能的一件事,所以我們可以通過判斷當前版本類型,在DEBUG的時候打印日志,在發布的時候不打印日志。
#ifdef DEBUG
# define MGLog(fmt, ...) NSLog((@"%s %d " fmt), __FUNCTION__, __LINE__, ##__VA_ARGS__);
#else
#define MGLog(...)
#endif
不過上面的代碼還打印了當前工程名字,感覺這一個信息用到的比較少,所以我們可以將上面代碼替換成
#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]
不過時間沒有精確到毫秒,這是一個缺憾,要不干脆定義兩個日志輸出宏好了,喜歡用哪個就調用哪個。