天天看點

iOS重定向輸出列印(NSLog、printf)

注:本文是重定向日志輸出到項目的其他子產品,非重定向直接輸出到檔案。       

在項目開發的時候,碰到一個很糾結的問題:因本人做的是iOS SDK層,同僚做的是App層,因分工不同,在調試和修複Bug的時候需要提供明确清晰的日志。若把項目中的全部日志都輸出到一個檔案中,查找雜亂而繁瑣,而我也隻需要SDK層的日志,是以日志重定向到檔案在此已不再合适(使用freopen重定向stdout、stderr輸出路徑即可,網上教程較多)。

是以個人根據需求分析之後,定義了2個宏:CLog、CPrintf(也可重寫系統的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接口的調用*/\
};
           

大緻思路如下,具體代碼可下載下傳下文中的Demo檢視:

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。