日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

iOS一个灵活可扩展的开源Log库

發布時間:2025/3/21 编程问答 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 iOS一个灵活可扩展的开源Log库 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
目前大部分iOS的小型開發團隊都不是很重視log,導致很多線上發生的或者用戶反饋的bug難以排查。對于App來說一個好的日志系統可以幫助我們用最小的代價來排查一些疑難bug,我們唯一要做的就是在合適的位置打印日志,記錄App的運行狀況。這樣做不僅僅可以讓我們在debug時查看App運行日志,還可以允許App通過某些方式將日志文件回傳供開發人員分析問題。

關于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; #endif

Log

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方法

  • 第一步:實現一個生成器
#import "COLLogger.h" @interface MyLogger : NSObject <COLLogger>@end #import "MyLogger.h" #import <os/log.h>@implementation MyLogger @synthesize formatterClass = _formatterClass;+ (instancetype)logger {return [[MyLogger alloc] init]; }// This is your own log method. It will be called by log engine. - (void)log:(NSString *)logString {//For example, here below uses os_log as its implementation.os_log(OS_LOG_DEFAULT, "%{public}s", [logString UTF8String]); } @end
  • 第二步:實現一個格式化器
#import "COLLogFormatter.h"@interface MyLogFormatter : NSObject <COLFormatable>@end #import "MyLogFormatter.h"@implementation MyLogFormatter // The log's format depends on this method. - (NSString *)completeLogWithType:(COLLogType)type tag:(NSString *)tag message:(NSString *)message date:(NSDate *)date {return [NSString stringWithFormat:@"tag=[%@], type=[%zd], message=[%@], date=[%@]", tag, type, message, date]; } @end
  • 第三步:實例化驅動器并加入到log引擎
COLLoggerDriver *myDriver = [[COLLoggerDriver alloc] initWithLogger:[MyLogger logger]formatter:[[MyLogFormatter alloc] init]level:COLLogLevelInfo]; [[COLLogManager sharedInstance].logEngine addDriver:myDriver];

后記

Log是我們開發過程中容易忽略的一步,但它又是十分重要的一項工作,我們要學會如何在合適的位置記錄合適log,這對于我們復現和排查問題真的有很大的幫助。

目前Coolog還是很有很多不完善的地方,包括瀏覽器調試工具也是一個初級的demo狀態,后續工作會放在log的性能優化和調試工具的搜索和過濾功能,包括調試工具的UI也會進一步優化。

總結

以上是生活随笔為你收集整理的iOS一个灵活可扩展的开源Log库的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。