自定义Log输出格式

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]

通过日志我们可以知道日志是在什么时间打印的,在什么类的什么方法里面,处于该类的第几行,这样方便我们快速定位。

实现过程分为如下几个步骤

  1. 创建一个pch文件(如果不懂怎么创建可以百度一下)
  2. 放入下面代码(贴代码格式乱了就直接上图了)
  3. 在输入日志的时候用MGLog(代替NSLog即可。


    自定义Log输出格式_第1张图片
    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]

不过时间没有精确到毫秒,这是一个缺憾,要不干脆定义两个日志输出宏好了,喜欢用哪个就调用哪个。

你可能感兴趣的:(自定义Log输出格式)