Log4OC github地址:https://github.com/icoder20150719/Log4OC
前言
对于有过服务端开发经验的小伙伴来说,系统日志是最常见的,比较java开发,log4j,我们写java服务端的话这个必带jar包。开发Log4OC这个iOS库也借鉴了log4j的回滚功能。但是对于iOS开发者来说,日志能貌似不常用,大多数开发者用用系统自带的NSLog,用来平时调试实现功能也就满足了,因为这些应用都是TO C的,开发者除了关注客户端闪退外,C端其他的事件并不关心,但是对于一些TO B的应用来说,经常要根据B端发了什么事情,或者说是B端客户端除了要关注闪退外还需要更加关注数据的完整性,数据事件的处理。废话不多说了,进入正题吧。
Log4OC的功能介绍
1.1控制台输出日志
控制输出功能和NSLog类似,下面是NSLog的控制台输出
NSLog(@"NSLOG");
输出结果
2018-02-02 14:09:02.694331+0800 LOGDemo[49041:389100] NSLOG
Log4OC输出结果
DEBUGLog(@"DEBUGLog");
INFOLog(@"INFOLog");
WARNINGLog(@"WARNINGLog");
ERRORLog(@"ERRORLog")
输出结果
【DEBUG】 2018-02-02 14:10:48.048 : DEBUGLog
【INFO】 2018-02-02 14:10:48.048 : INFOLog
【WARNING】 2018-02-02 14:10:48.048 : WARNINGLog
【ERROR】 2018-02-02 14:10:48.048 : ERRORLog
1.2日志写入文件
输出的日志会写入文件当中,文件路径为app中的/Documents/Log/access_2018_02_02_1.log
1.3日志级别控制
日志可以分4个级别输出,分别为DEBUG、INFO、WARNING、ERROR,其中ERROR的级别最高,DEBUG的级别最低,默认是所有级别都可以输出。
在开发中,我们希望发布release版本之后优化app的性能,不在打印日志到控制台。
使用NSLog是这么用的,定义个XXLog的宏来替换NSLog,在debug模式下把XXLog定义为NSLog,在非debug模式下把 XXLog定义为空函数。在项目中使用XXLog来打印日志。
#ifdef DEBUG //调试状态 打开log功能
#define XXLog(...) NSLog(__VA_ARGS__)
#else
#define XXLog(...) //非调试状态 关闭log功能
#endif
如果使用Log4OC可以调用setLogLevel()函数设置某个级别一下的日志将不再输出到日志中。
//设置WARNING以下的级别日志不再输出到日志中
setLogLevel(LogLevel_ERROR);
发布release版本不再输出某个级别的日志
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
#ifdef __OPTIMIZE__
setLogLevel(LogLevel_ERROR);
#endif
return YES;
}
可以将Run app的build配置为release进行测试
设置步骤
-
step1
-
step2
1.4日志积累到多大回滚文件
默认当单个日志大于10MB,将会生成另外一个日志文件,另外每天也会生成一个新的日志文件格式:access_2018_02_02_1.log。
Log4OC的基本使用
使用pod管理 pod "Log4OC" 或者github下载把Log4OC.h/m拖入项目中。
根据上面的功能介绍使用也差不多了,输出debug级别的日志为DEBUGLog(@"DEBUGLog");
参数方法和NSLog一样。
NSString *str = @"hello world";
DEBUGLog(@"%@",str);
Log4OC的实现原理
1、级别控制级别是一个枚举 采用二进制来设置枚举值, 二进制的枚举好处在于可以进行&、|等逻辑运算。
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、日志回滚,根据日志文件大小来判断是否需要生成一个新的文件
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()函数重定向
输出结果,指向文件和控制台。
Log4OC github地址:https://github.com/icoder20150719/Log4OC