非联调开发(直连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控制台
2、选择左侧设备
3、右上角筛选
进程:APP的product name
APP的product name 获取位置
🎉🎉🎉现在就可以愉快的玩耍实时日志了🎉🎉🎉