iOS最小成本实时预览日志

140 阅读1分钟

非联调开发(直连Xcode)想实时预览日志很复杂,仅管写入文件了,实时预览也不符合本文「最小成本」实现的宗旨

#NSLog 在iOS开发中,我们经常会用到NSLog调试,但是我们却不太了解它。在NSLog本质是一个C函数,它的函数声明如下: FOUNDATION_EXPORT void NSLog(NSString *format, ...)

系统对它的说明是:Logs an error message to the Apple System Log facility.。他是用来输出信息到标准Error控制台上去的,其内部其实是使用Apple System Log的API。在调试阶段,日志会输出到到Xcode中,而在iOS真机上,它会输出到系统的/var/log/syslog这个文件中。

在iOS中,把日志输出到文件中的句柄在unistd.h文件中有定义:

#define STDIN_FILENO 0 /* standard input file descriptor */
#define STDOUT_FILENO 1 /* standard output file descriptor */
#define STDERR_FILENO 2 /* standard error file descriptor */

NSLog输出的是到STDERR_FILENO上,我们可以在iOS中使用c语言输出到的文件的fprintf来验证:

NSLog(@"iOS NSLog");
fprintf (stderr, "%s\n", "fprintf log");

由于fprintf并不会像NSLog那样,在内部调用ASL接口,所以只是单纯的输出信息,并没有添加日期、进程名、进程id等,也不会自动换行。

#接入方法 使用白名单等AB侧限制,固定用户、设备本地打印日志也映射为NSLog

伪代码

public class LogHelper {
    static public func error(_ message: String) {
      log.info(message)
      LogHelperOC.log(message)
  }
}

@implementation LogHelperOC

+ (void)log:(NSString *)message {
    if ([LogHelperOC _isShouldLog]) {
        NSLog(@"%@", message);
    }
}

/// 白名单配置
+ (BOOL)_isShouldLog {
    return 白名单
}

@end

#工具 0、开启指定用户、设备白名单 1、连接手机并打开mac控制台 image.png 2、选择左侧设备 image.png 3、右上角筛选 进程:APP的product name image.png APP的product name 获取位置 企业微信截图_b8274e19-9fdd-484d-af72-3261be092498.png

🎉🎉🎉现在就可以愉快的玩耍实时日志了🎉🎉🎉

参考文章:www.lmlphp.com/user/16640/…