Skip to content

利用 QMUILog 提高调试效率

MoLice edited this page Feb 7, 2018 · 2 revisions

QMUI iOS 2.4.0 版本增加了一个新控件——QMUILog,用于代替系统原生的 NSLog,本文简单介绍一下使用场景和使用方法。

背景

相比 Android 而言,iOS 原生的 NSLog() 功能较弱,没有 log 类型分组、优先级区分,且 IDE Xcode 也无法过滤 log,所以在调试过程中自己关注的 log 经常会淹没在大量其他 log 中,难以识别。

功能介绍

基于这些缺陷,我们增加了 QMUILog 控件,它主要提供的功能有:

1. 优先级

提供优先级的概念,按照 QMUILog()QMUILogInfo()QMUILogWarn() 3个维度划分,你可以自行决定某个 log 要以哪个级别输出。

QMUILogInfo(@"Default", @"不重要的信息,适合用 info");

而如果你有用配置表,则可以通过配置表全局控制是否要输出这个等级的 log。

QMUICMI.shouldPrintDefaultLog = YES; // ShouldPrintDefaultLog : 是否允许输出 QMUILogLevelDefault 级别的 log
QMUICMI.shouldPrintInfoLog = YES;    // ShouldPrintInfoLog : 是否允许输出 QMUILogLevelInfo 级别的 log
QMUICMI.shouldPrintWarnLog = YES;    // ShouldPrintInfoLog : 是否允许输出 QMUILogLevelWarn 级别的 log

2. 分组

提供分组的概念,每个 log 都需要指定一个 name,你可以为相同模块的 log 指定相同的 name,例如相册控件的 log 可以这么写:

QMUILog(@"QMUIAssetLibrary", @"选中第 %@ 张图片", @(xxx));
QMUILogWarn(@"QMUIAssetLibrary", @"读取资源错误,error is %@", error);

3. 过滤

通过 QMUIKit 自带的 QMUILogManagerViewController 提供过滤的功能(最关键),可让控制台只显示某个指定 name 的 log,这样就不会受到其他无关 log 的影响(读某个关键 log 的时候忽然被大量其他 log 推走的感受历历在目)。在 log name 超过一定数量时还会提供搜索框和右边的 section index 索引条方便检索。

注意只有曾经打印过的 log name 才会出现在列表里。另外 NSLog() 的 log 暂时无法被过滤,后续会优化这一点。

image

4. 格式化

QMUILog 会输出一些额外的辅助信息,包括方法名、代码行数、log 级别、log name,这些是默认的内容,业务项目也可通过 QMUILoggerDelegate 自定义自己想要的输出内容及格式,甚至把 log 内容记录到本地文件。

image

使用方式

QMUILog 的使用方式与 NSLog 基本一致,只是多了一个必填的参数,也即第一个参数 name。

// 如果是以前
NSLog(@"选中了第 %@ 张图", @(xxx));

// 用 QMUILog 的话
QMUILogInfo(@"ImagePicker", @"选中了第 %@ 张图", @(xxx));

// 如果这个 log 不需要 name,则随便指定一个
QMUILog(@"Default", @"选中了第 %@ 张图", @(xxx));

如果需要过滤 log,则建议在 DEBUG 下为 App 增加一个彩蛋界面,初始化一个 QMUILogManagerViewController 对象即可。

#ifdef DEBUG
QMUILogManagerViewController *viewController = [[QMUILogManagerViewController alloc] init];
[self.navigationController pushViewController:viewController animated:YES];
#endif

更多的示例代码可下载最新的 QMUI Demo 查看。