最近在研究隐私合规的政策,发现有一条叫
《TTAF 077.14-2021 APP收集使用个人信息最小必要评估规范 应用日志信息》
发现对日志输出有相应要求,不能明文输出包含个人信息的日志到控制台。
针对这个要求,想到了如下三个方案,但是都有一些弊端,希望各位大佬可以指点一下:
方案一:
利用git hooks,在pre-push的阶段扫描代码,发现存在print和NSLog等函数即报错,停止提交操作。
优点:可以从根源上杜绝开发人员提交包含日志输出的代码,提高代码执行效率
缺点:git hooks好像无法自动更新(可能是我太菜了),如果要更改规则比较麻烦,而且容易被开发怼。
方案二:
使用fishhook去拦截相应的NSLog和print函数,然后内部不执行任何操作。
优点:全局直接拦截,随便开发阶段怎么使用
缺点:首先稳定性是个大问题,可能会出现奇怪的崩溃。而且项目中大量使用Swift,Swift的print函数hook不到(可能是我太菜了)
方案三:
使用dup2重定向日志输出到/dev/null
这个是目前用的临时方案。
优点:全局直接拦截,随便开发阶段怎么使用
缺点:日志只是不输出到控制台了,但是依然会走所有print或者NSLog的逻辑,对性能没有任何提升。
#import <sys/uio.h>
#import <stdio.h>
int fd = 0;
fflush(stdout);
fflush(stderr);
setvbuf(stdout,NULL,_IONBF,0);
fd = open("/dev/null", (O_RDWR | O_CREAT), 0644);
if(-1 == fd) {
printf("\n open() failed with error [%s]\n", strerror(errno));
} else {
dup2(fd, STDOUT_FILENO);
dup2(fd, STDERR_FILENO);
printf("Here is dll init, redirect stdout and stderr to logfile\n");
}
至于为什么不用公用的管理类去控制打印日志。。其实这个类很早就有了,也一直在推广,但是开发还是习惯于直接一个print(提交代码时又不删),毕竟需要多import一个头文件,使用还是很繁琐的。