iOS一个灵活可扩展的开源Log库
關于NSLog
蘋果提供的NSLog是大多數開發者常用的日志工具,但是NSLog還是無法滿足我們對于Log的其他需求,如日志分級、日志持久化等。另外我們知道NSLog其實并不是printf的封裝而是ASL的高級封裝,蘋果在文檔上也說明了NSLog的設計目的是Logs an error message,因此我們如果在開發中大量使用NSLog,App的性能會變得非常糟糕。關于NSLog的性能問題可以參看這篇sunnyxx的文章【NSLog效率低下的原因及嘗試lldb斷點打印Log】
需求
- 獨立開關。比如我們希望在debug版本中打開控制臺log和文件log,在release版本中只打開文件log的功能。
- 可擴展性和靈活性。我們知道在iOS10以后蘋果建議使用os.log來取代NSLog,我們希望有一個具有很強擴展性的log庫,使我們可以很輕易地將log底層實現替換為os.log而不必改變原有的log代碼。
- 自定義格式。可以自定義log輸出的標準格式,同時也不希望原有的log調用接口有大量改動。
- 日志查看工具。我們知道NSLog在Mac提供了Console.app這樣的調試工具,使得我們即使不在xcode的debug模式下也可以隨時查看App的日志。甚至,我們希望使用windows PC也可以在非debug模式下查看log。
- 分級與過濾。log應該被劃分為不同等級,同時在debug和release下我們可以設置不同級別的過濾器,低級別的log可以被過濾掉。舉個?:假如有info、default、warning、error四個等級log,我們可能會希望在debug下輸出所有等級的log,而在release下只輸出warning和error等級的log。
輪子
先上輪子Github
Coolog設計之初就是為了解決上面所提到的這些需求。Coolog具有高度的可擴展性和靈活性,同時提供了一個瀏覽器的調試工具。目前,Coolog還有很多需要完善的地方,包括瀏覽器調試工具目前也只是一個demo,歡迎大家成為Coolog的Contributor。
架構
為了保證可擴展性和靈活性,Coolog包含了了生成器(COLLogger)、格式化協議與格式化器(COLFormatable和COLLogFormatter)、驅動器(COLLoggerDriver)、引擎(COLEngine)、管理者(COLLogManager),他們之間的關系可見下圖:
下面我們來一一說明它們各自的作用。
生成器 COLLogger
顧名思義,生成器負責最終log的生成,COLLogger是一個協議。Coolog提供了三種生成器,分別是COLNSLogger、COLConsoleLogger、COLFileLogger,這三個類都實現了COLLogger協議中- (void)log:(NSString *)logString;這個方法。在該方法中我們最終定義了這個類型的log最后的生成方法,log引擎會通過驅動器調用到該方法輸出log。
除了這三種生成器,也可以自己實現COLLogger協議來自定義一個生成器。
格式化協議 COLFormatable
這個協議只有一個方法,這個方法定義了log的輸出格式。
- (NSString *)completeLogWithType:(COLLogType)typetag:(NSString *)tagmessage:(NSString *)messagedate:(NSDate *)date;格式化器 COLLogFormatter
格式化器就是實現了COLFormatable格式化協議的類,默認我們提供了與上述三種生成器對應的三種格式化器NSLogFormatter、ConsoleFormatter、FileFormatter,他們分別對應原生NSLog、控制臺與瀏覽器工具log和文件log。這個三個類我們使用了類族提供工廠方法完成初始化,在自定義格式化器時并不需要繼承COLLogFormatter,是需要實現COLFormatable協議即可。
驅動器 COLLoggerDriver
驅動器是一個容器,生成器與格式化器將作為依賴注入到驅動器中,同時驅動器負責log的級別的配置,實現log分級過濾。log類型分為5中:Error>Warning>Info>Default>Debug,過濾的級別分為7級:LevelOff>LevelError>LevelWarning>LevelInfo>LevelDefault>LevelDebug>LevelAll,低級別的log可能會被過濾,比如如果當前過濾級別為LevelInfo,那么將只有Error、Warning、Info 這三種類型的log會被輸出。最終驅動器將交由log引擎統一管理。
引擎 COLEngine
引擎負責管理所有的驅動器,由它負責啟動log,引擎可以隨時移除或者加入單個log驅動器,實現不同log的獨立開關。
使用
初始化
[[COLLogManager sharedInstance] setup];[[COLLogManager sharedInstance] enableFileLog]; // 打開文件log [[COLLogManager sharedInstance] enableConsoleLog]; // 打開控制臺log // [[COLLogManager sharedInstance] enableNSLog]; // 一般控制臺log和NSLog不同時打開// Debug下打開所有級別log,Release下打開Info級別以上的log #ifdef DEBUG[COLLogManager sharedInstance].level = COLLogLevelAll; #else[COLLogManager sharedInstance].level = COLLogLevelInfo; #endifLog
CLogError(@"tag", @"%@", @"log content"); CLogE(@"%@", @"log content");CLogWarning(@"tag", @"%@", @"log content"); CLogW(@"%@", @"log content");CLogInfo(@"tag", @"%@", @"log content"); CLogI(@"%@", @"log content");CLogDefault(@"tag", @"%@", @"log content"); CLog(@"%@", @"log content");CLogDebug(@"tag", @"%@", @"log content"); CLogD(@"%@", @"log content");瀏覽器調試
首先打開瀏覽器調試功能。
[[COLLogManager sharedInstance] enableRemoteConsole];將電腦和手機連到同一個wifi下,打開瀏覽器訪問[(http://coolog.oss-cn-hangzhou...://[YourPhoneIPAddr]:9001/coolog](http://coolog.oss-cn-hangzhou...://[YourPhoneIPAddr]:9001/coolog),注意地址后面的參數[YourPhoneIPAddr]替換為手機的IP地址。
目前效果是下面這樣。
加入自定義的log方法
- 第一步:實現一個生成器
- 第二步:實現一個格式化器
- 第三步:實例化驅動器并加入到log引擎
后記
Log是我們開發過程中容易忽略的一步,但它又是十分重要的一項工作,我們要學會如何在合適的位置記錄合適log,這對于我們復現和排查問題真的有很大的幫助。
目前Coolog還是很有很多不完善的地方,包括瀏覽器調試工具也是一個初級的demo狀態,后續工作會放在log的性能優化和調試工具的搜索和過濾功能,包括調試工具的UI也會進一步優化。
總結
以上是生活随笔為你收集整理的iOS一个灵活可扩展的开源Log库的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: WPF绘制简单常用的Path
- 下一篇: 关于金蝶k3 wise供应生门户登陆界面