iOS開發(fā)之寫日志Log4OC使用、原理介紹

Log4OC github地址:https://github.com/icoder20150719/Log4OC

前言

對(duì)于有過服務(wù)端開發(fā)經(jīng)驗(yàn)的小伙伴來說,系統(tǒng)日志是最常見的,比較java開發(fā),log4j,我們寫java服務(wù)端的話這個(gè)必帶jar包。開發(fā)Log4OC這個(gè)iOS庫也借鑒了log4j的回滾功能。但是對(duì)于iOS開發(fā)者來說,日志能貌似不常用,大多數(shù)開發(fā)者用用系統(tǒng)自帶的NSLog,用來平時(shí)調(diào)試實(shí)現(xiàn)功能也就滿足了,因?yàn)檫@些應(yīng)用都是TO C的,開發(fā)者除了關(guān)注客戶端閃退外,C端其他的事件并不關(guān)心,但是對(duì)于一些TO B的應(yīng)用來說,經(jīng)常要根據(jù)B端發(fā)了什么事情,或者說是B端客戶端除了要關(guān)注閃退外還需要更加關(guān)注數(shù)據(jù)的完整性,數(shù)據(jù)事件的處理。廢話不多說了,進(jìn)入正題吧。

Log4OC的功能介紹
1.1控制臺(tái)輸出日志

控制輸出功能和NSLog類似,下面是NSLog的控制臺(tái)輸出

NSLog(@"NSLOG");
輸出結(jié)果
2018-02-02 14:09:02.694331+0800 LOGDemo[49041:389100] NSLOG

Log4OC輸出結(jié)果

DEBUGLog(@"DEBUGLog");
INFOLog(@"INFOLog");
WARNINGLog(@"WARNINGLog");
ERRORLog(@"ERRORLog")
輸出結(jié)果
【DEBUG】 2018-02-02 14:10:48.048 : DEBUGLog 
【INFO】 2018-02-02 14:10:48.048 : INFOLog 
【W(wǎng)ARNING】 2018-02-02 14:10:48.048 : WARNINGLog 
【ERROR】 2018-02-02 14:10:48.048 : ERRORLog 
1.2日志寫入文件

輸出的日志會(huì)寫入文件當(dāng)中,文件路徑為app中的/Documents/Log/access_2018_02_02_1.log


image.png
1.3日志級(jí)別控制

日志可以分4個(gè)級(jí)別輸出,分別為DEBUG、INFO、WARNING、ERROR,其中ERROR的級(jí)別最高,DEBUG的級(jí)別最低,默認(rèn)是所有級(jí)別都可以輸出。
在開發(fā)中,我們希望發(fā)布release版本之后優(yōu)化app的性能,不在打印日志到控制臺(tái)。
使用NSLog是這么用的,定義個(gè)XXLog的宏來替換NSLog,在debug模式下把XXLog定義為NSLog,在非debug模式下把 XXLog定義為空函數(shù)。在項(xiàng)目中使用XXLog來打印日志。

#ifdef DEBUG //調(diào)試狀態(tài) 打開log功能
#define XXLog(...) NSLog(__VA_ARGS__)
#else
#define XXLog(...) //非調(diào)試狀態(tài) 關(guān)閉log功能
#endif

如果使用Log4OC可以調(diào)用setLogLevel()函數(shù)設(shè)置某個(gè)級(jí)別一下的日志將不再輸出到日志中。

//設(shè)置WARNING以下的級(jí)別日志不再輸出到日志中
setLogLevel(LogLevel_ERROR);

發(fā)布release版本不再輸出某個(gè)級(jí)別的日志

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
#ifdef __OPTIMIZE__
   setLogLevel(LogLevel_ERROR);
#endif
   return YES;
}

可以將Run app的build配置為release進(jìn)行測(cè)試
設(shè)置步驟

  • step1


    image.png
  • step2


    image.png
1.4日志積累到多大回滾文件

默認(rèn)當(dāng)單個(gè)日志大于10MB,將會(huì)生成另外一個(gè)日志文件,另外每天也會(huì)生成一個(gè)新的日志文件格式:access_2018_02_02_1.log。

Log4OC的基本使用
使用pod管理 pod "Log4OC" 或者github下載把Log4OC.h/m拖入項(xiàng)目中。
根據(jù)上面的功能介紹使用也差不多了,輸出debug級(jí)別的日志為DEBUGLog(@"DEBUGLog");參數(shù)方法和NSLog一樣。

NSString *str = @"hello world";
DEBUGLog(@"%@",str); 
Log4OC的實(shí)現(xiàn)原理
1、級(jí)別控制級(jí)別是一個(gè)枚舉 采用二進(jìn)制來設(shè)置枚舉值, 二進(jìn)制的枚舉好處在于可以進(jìn)行&、|等邏輯運(yùn)算。
typedef NS_ENUM(NSUInteger,LogLevel) {
    /*! 顯示包括(DEBUGLog,VERBOSELog,INFOLog,WARNINGLog,ERRORLog的Log)*/
    LogLevel_DEBUG   = 0b00011111,
    /*! 顯示包括(VERBOSELog,INFOLog,WARNINGLog,ERRORLog的Log)*/
    LogLevel_VERBOSE = 0b00001111,
    /*! 顯示包括(INFOLog,WARNINGLog,ERRORLog的Log)*/
    LogLevel_INFO    = 0b00000111,
    /*! 顯示包括(WARNINGLog,ERRORLog的Log)*/
    LogLevel_WARNING = 0b00000011,
    /*! 只顯示ERRORLog的log*/
    LogLevel_ERROR   = 0b00000001,
};
2、日志回滾,根據(jù)日志文件大小來判斷是否需要生成一個(gè)新的文件
static inline void rollBackSize () {
    if (fileSize(__filePath) >= __fileSize) {
        __count ++;
        if (__logOutp) {
             fclose(__logOutp);
        }
        NSString *filePath = creatLogFile(creatLogDir());
        __filePath = filePath;
        //打開輸出文件
        __logOutp = fopen([filePath UTF8String],"a+");
        setvbuf(__logOutp, NULL, _IONBF, 0);
    }
}
3、日志輸入文件,利用了c的vfprintf()函數(shù)重定向

輸出結(jié)果,指向文件和控制臺(tái)。
Log4OC github地址:https://github.com/icoder20150719/Log4OC

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,641評(píng)論 19 139
  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 179,172評(píng)論 25 708
  • Spring Boot 參考指南 介紹 轉(zhuǎn)載自:https://www.gitbook.com/book/qbgb...
    毛宇鵬閱讀 47,279評(píng)論 6 342
  • 今天考完試了,狀態(tài)能比昨天恢復(fù)一些,不過感覺,又并不是什么好兆頭。 拉著我媽剛?cè)ベI了點(diǎn)水果,路上跟她聊了好多。 她...
    Vano_閱讀 182評(píng)論 0 0
  • 我一直都在把這種聲音,想象成 一掛酣暢淋漓的響炮 突突,好像火苗剛起又滅 突突,好像小偷試探性的敲門 突突,好像一...
    小知識(shí)階層閱讀 173評(píng)論 2 2

友情鏈接更多精彩內(nèi)容