自定义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即可。


    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]

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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 173,558评论 25 708
  • 在应用程序中添加日志记录总的来说基于三个目的:监视代码中变量的变化情况,周期性的记录到文件中供其他应用进行统计分析...
    时待吾阅读 5,030评论 0 6
  • 宏定义在C系开发中可以说占有举足轻重的作用。底层框架自不必说,为了编译优化和方便,以及跨平台能力,宏被大量使用,可...
    你好自己阅读 1,061评论 0 5
  • 在应用程序中添加日志记录总的来说基于三个目的:监视代码中变量的变化情况,周期性的记录到文件中供其他应用进行统计分析...
    时待吾阅读 5,084评论 1 13
  • 大半夜的哥们来信息说又换了女朋友,当时我是迷迷糊糊从睡梦中醒来,还没搞明白什么事。于是随手回了一句:噢,恭喜! 只...
    止痛先生阅读 220评论 0 0