iOS开发之写日志Log4OC使用、原理介绍

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


image.png
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


    image.png
  • step2


    image.png
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

你可能感兴趣的:(iOS开发之写日志Log4OC使用、原理介绍)