iOS重定向输出打印(NSLog、printf)

注:本文是重定向日志输出到项目的其他模块,非重定向直接输出到文件。       

在项目开发的时候,碰到一个很纠结的问题:因本人做的是iOS SDK层,同事做的是App层,因分工不同,在调试和修复Bug的时候需要提供明确清晰的日志。若把项目中的全部日志都输出到一个文件中,查找杂乱而繁琐,而我也只需要SDK层的日志,因此日志重定向到文件在此已不再合适(使用freopen重定向stdout、stderr输出路径即可,网上教程较多)。

因此个人根据需求分析之后,定义了2个宏:CLogCPrintf(也可重写系统的NSLog,printf接口,在此为了不混淆系统接口和功能,自己重新定义了2个宏),再单独封装了一个单例类ZJLogSDK,提供一个代理回调给App层进行显示或保存。

#define CLog(...) [[ZJLogSDK sharedTool] sendLogStr:[NSString stringWithFormat:__VA_ARGS__]]
#define CPrintf(...)  \
{\
    char cLogBuf[1024] = {0}; /*只支持1024个字节的输出(可自行调节大小)*/\
    snprintf((char *)cLogBuf, sizeof(cLogBuf), __VA_ARGS__); /*将格式字符串和可变参数列表保存到cLogBuf中*/\
    CPrintfCallback(cLogBuf); /*此函数定义在只包含c变量和接口的头文件中,实现在m文件中,从而进行oc接口的调用*/\
};

CLog宏实现相对比较简单,只要把输出格式字符串和可变参数列表用NSString再进行格式化为字符串即可。

CPrintf需要先使用snprintf将格式字符串和可变参数列表进行字符串拼接操作,之后再通过连接到单例ZJLogSDK中进行输出或打印。


我写了一个简单的Demo,有兴趣可以看下,文件功能内容如下:

ZJLogSDK(h、mm):主体部分,包括代理设置、日志总开关、日志上报开关,在此用mm后缀可兼容m、mm(C++类)两种OC文件使用CLog,若使用m后缀则在mm文件中无法使用;

ZJLogSDKExt(h):即ZJLogSDK类的扩展,主要是实现单例和封装外部不可访问的接口和变量(若不需要单独封装,可将内容合并到ZJLogSDK.h中);

ZJLogPrintf(h):CPrintf宏的定义窗口,主要是为C文件使用CPrintf做接口;

ZJLogBridgeC(h、m):此唯一目的就是桥接C和OC之间的接口,调用路径为CPrintf->CPrintfCallback->ZJLogSDK。

猜你喜欢

转载自blog.csdn.net/lizhijian21/article/details/80912166
今日推荐