深入解析iOS日志庫CocoaLumberjack

我們在開發(fā)中經(jīng)常需要打日志压鉴,iOS提供的NSLog只能在Xcode里面查看宦赠,這種方式有如下限制:

1、只有處于Debug模式下才能在Xcode看到日志队萤,其他情況無能為力轮锥。測試、產(chǎn)品等同事在測試和體驗(yàn)App的時(shí)候由于日志沒有記錄到本地要尔,對于一些無法復(fù)現(xiàn)或者復(fù)現(xiàn)路徑很難的問題肯定束手無策舍杜。

2、發(fā)布到App Store的App赵辕,下載了這個(gè)App的用戶出現(xiàn)了無法復(fù)現(xiàn)或者復(fù)現(xiàn)路徑很難的問題既绩,我們也只能干著急。

CocoaLumberjack這個(gè)開源日志庫就是為了解決上訴兩個(gè)問題的匆帚。

一熬词、什么是CocoaLumberjack?

CocoaLumberjack是iOS業(yè)界有名的github開源日志庫吸重,提供如下功能:

1互拾、支持日志打印到Xcode控制臺,打印到mac的console程序嚎幸、打印到文件

2颜矿、日志功能支持關(guān)閉和打開,支持Error嫉晶、Warning骑疆、Info田篇、Debug、Verbose箍铭、All日志等級

3泊柬、支持基于DDLogFormatter協(xié)議自定義日志格式和繼承DDAbstractLogger和協(xié)議DDLogger自定義logger

二、用法

用法很簡單诈火,具體參照github兽赁,這里貼一段簡單的代碼

[DDLog addLogger:[DDTTYLogger sharedInstance]]; // TTY = Xcode console

[DDTTYLogger sharedInstance].logFormatter = [[MyCustomDDLogFormatter alloc] init];

DDFileLogger *fileLogger = [[DDFileLogger alloc] init]; // File Logger

fileLogger.rollingFrequency = 60 * 60 * 24; // 24 hour rolling

fileLogger.maximumFileSize = 50 * 1024 * 1024; //50MB

fileLogger.logFileManager.maximumNumberOfLogFiles = 7;

fileLogger.logFormatter = [[MyCustomDDLogFormatter alloc] init];

[DDLog addLogger:fileLogger];

三、架構(gòu)圖


梳理一下各個(gè)類的作用和關(guān)系:

1冷守、DDLog刀崖,全局單例類。此類通過方法+ (void)addLogger:(id)logger保存了一系列繼承于DDAbstractLogger的logger拍摇,通過_loggers屬性保存logger亮钦,該類相當(dāng)于一個(gè)服務(wù)分發(fā)器,外部調(diào)用DDLogxxx宏(比如DDLogDebug)實(shí)際上都會(huì)路由到DDLog的log方法充活,最終通過lt_log方法調(diào)用各個(gè)logger的logMessage方法實(shí)現(xiàn)日志打印蜂莉。

2、DDAbstractLogger堪唐,實(shí)現(xiàn)了協(xié)議DDLogger巡语,所有l(wèi)ogger都繼承于該類。

3淮菠、DDLogger協(xié)議男公,最重要的方法是- (void)logMessage:(DDLogMessage *)logMessage,所有繼承于DDAbstractLogger的logger通過實(shí)現(xiàn)該方法進(jìn)行日志的打印合陵。通過logFormatter屬性保存了日志格式化實(shí)例

4枢赔、DDLogFormatter,通過方法- (NSString *)formatLogMessage:(DDLogMessage *)logMessage格式化DDLogMessage對象

5拥知、DDTTYLogger踏拜,通過該類把日志打印到Xcode控制臺。

6低剔、DDASLLogger速梗,通過該類把日志打印到mac的console程序里面。

7襟齿、DDFileLogger姻锁,通過該類把日志保存到文件。

8猜欺、DDAbstractDatabaseLogger位隶,通過實(shí)現(xiàn)該類把日志保存到數(shù)據(jù)庫里面。

四开皿、實(shí)現(xiàn)關(guān)鍵點(diǎn):

1涧黄、如何實(shí)現(xiàn)日志打印不阻塞主線程篮昧?

對于每個(gè)繼承于DDAbstractLogger的類比如DDFileLogger,內(nèi)部會(huì)創(chuàng)建一個(gè)分發(fā)對象_loggerQueue笋妥,所有的logMessage方法都會(huì)運(yùn)行在這個(gè)_loggerQueue里面懊昨。

DDLog類創(chuàng)建了一個(gè)串行的分發(fā)隊(duì)列_loggingQueue,通過_loggingQueue把外部的DDLogxxx調(diào)用異步路由到lt_log方法里面春宣;通過全局分發(fā)組對象dispatch_group_t _loggingGroup來等待外部的DDLogxxx調(diào)用分發(fā)到相應(yīng)的logger打印結(jié)束疚颊;另外,通過信號量_queueSemaphore來控制queueLogMessage最大調(diào)用量信认,最大為1000,大于1000將排隊(duì)等待均抽。

2、DDFileLogger的工作機(jī)制

rollingFrequency和maximumFileSize如何控制單個(gè)日志文件?

CocoaLumberjack在訪問最近創(chuàng)建的一個(gè)日志文件時(shí)嗅定,會(huì)根據(jù)回滾頻率和日志文件大小決定是否需要?jiǎng)?chuàng)建新的日志文件暇检,如果日志文件存活時(shí)間大于等于回滾頻率或者日志文件大小大于等于最大大小,則回滾該日志文件(給該日志文件后綴加上kDDXAttrArchivedName)深寥,并且創(chuàng)建一個(gè)新的日志文件來存日志攘乒;否則繼續(xù)用這個(gè)日志文件存日志。日志文件存活時(shí)間是以日志文件創(chuàng)建時(shí)間為基準(zhǔn)的惋鹅。

每次調(diào)用logMessage方法的時(shí)候都會(huì)調(diào)用maybeRollLogFileDueToSize檢測日志文件大小是否超過maximumFileSize则酝; 通過dispatch_source_create(DISPATCH_SOURCE_TYPE_TIMER, 0, 0, self.loggerQueue)創(chuàng)建一個(gè)計(jì)時(shí)器,定時(shí)掃描文件來實(shí)現(xiàn)文件存活時(shí)間功能闰集。

logFileManager屬性maximumNumberOfLogFiles如何控制一系列日志文件沽讹。

通過kvo maximumNumberOfLogFiles 和logFilesDiskQuota調(diào)用deleteOldLogFiles來實(shí)現(xiàn)最多保持maximumNumberOfLogFiles個(gè)日志文件。

3武鲁、如何實(shí)現(xiàn)日志文件上傳到自己的服務(wù)器爽雄?

后臺下發(fā)一個(gè)命令字,打包壓縮日志文件上傳即可沐鼠。也可以通過自己自定義logger來實(shí)現(xiàn)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末挚瘟,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子饲梭,更是在濱河造成了極大的恐慌乘盖,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,122評論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件排拷,死亡現(xiàn)場離奇詭異侧漓,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)监氢,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,070評論 3 395
  • 文/潘曉璐 我一進(jìn)店門布蔗,熙熙樓的掌柜王于貴愁眉苦臉地迎上來藤违,“玉大人,你說我怎么就攤上這事纵揍《倨梗” “怎么了?”我有些...
    開封第一講書人閱讀 164,491評論 0 354
  • 文/不壞的土叔 我叫張陵泽谨,是天一觀的道長璧榄。 經(jīng)常有香客問我,道長吧雹,這世上最難降的妖魔是什么骨杂? 我笑而不...
    開封第一講書人閱讀 58,636評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮雄卷,結(jié)果婚禮上搓蚪,老公的妹妹穿的比我還像新娘。我一直安慰自己丁鹉,他們只是感情好妒潭,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,676評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著揣钦,像睡著了一般雳灾。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上冯凹,一...
    開封第一講書人閱讀 51,541評論 1 305
  • 那天谎亩,我揣著相機(jī)與錄音,去河邊找鬼谈竿。 笑死团驱,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的空凸。 我是一名探鬼主播嚎花,決...
    沈念sama閱讀 40,292評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼呀洲!你這毒婦竟也來了紊选?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,211評論 0 276
  • 序言:老撾萬榮一對情侶失蹤道逗,失蹤者是張志新(化名)和其女友劉穎兵罢,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體滓窍,經(jīng)...
    沈念sama閱讀 45,655評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡卖词,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,846評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片此蜈。...
    茶點(diǎn)故事閱讀 39,965評論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡即横,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出裆赵,到底是詐尸還是另有隱情东囚,我是刑警寧澤,帶...
    沈念sama閱讀 35,684評論 5 347
  • 正文 年R本政府宣布战授,位于F島的核電站页藻,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏植兰。R本人自食惡果不足惜份帐,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,295評論 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望楣导。 院中可真熱鬧弥鹦,春花似錦、人聲如沸爷辙。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,894評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽膝晾。三九已至,卻和暖如春务冕,著一層夾襖步出監(jiān)牢的瞬間血当,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,012評論 1 269
  • 我被黑心中介騙來泰國打工禀忆, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留臊旭,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,126評論 3 370
  • 正文 我出身青樓箩退,卻偏偏與公主長得像离熏,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子戴涝,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,914評論 2 355

推薦閱讀更多精彩內(nèi)容