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

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

