博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
(20160604)开源第三方学习之CocoaLumberjack
阅读量:6806 次
发布时间:2019-06-26

本文共 8890 字,大约阅读时间需要 29 分钟。

CocoaLumberjack是一个很好用的日志打印工具,它可以帮助我们把工程中的日志信息打印到终端或者输出到文件中。

地址:

类图:

 

 

 

一:插件的运用

因为网上已经对CocoaLumberjack的运用都有很详细的介绍,有部分内容整理源自于网络结合项目中的运用进行讲解;

1.1:DDLog输出的类型

DDLog:基础类,必须引入的。DDASLLogger:支持将调试语句写入到苹果的日志中。一般正对Mac开发。可选。DDTTYLogger:支持将调试语句写入xCode控制台。我们即使要用它。可选。DDFileLogger:支持将调试语句写入到文件系统。可选。

1.2: DDLog日志等级种类

DDLogError:定义输出错误文本DDLogWarn:定义输出警告文本DDLogInfo:定义输出信息文本DDLogDebug:定义输出调试文本DDLogVerbose:定义输出详细文本提供的日志级别为:LOG_LEVEL_ERROR:只显示错误日志。LOG_LEVEL_WARN:包括:LOG_LEVEL_ERRORLOG_LEVEL_INFO:包括:LOG_LEVEL_WARNLOG_LEVEL_DEBUG:包括:LOG_LEVEL_INFOLOG_LEVEL_VERBOSE:包括:LOG_LEVEL_DEBUGLOG_LEVEL_OFF:关闭日志

1.3: 设置不同等级颜色

[[DDTTYLogger sharedInstance] setColorsEnabled:YES];// 启用颜色区分[[DDTTYLogger sharedInstance] setForegroundColor:[UIColor whiteColor] backgroundColor:[UIColor grayColor] forFlag:DDLogFlagVerbose]; //设置文字为白色,背景为灰色。[[DDTTYLogger sharedInstance] setForegroundColor:[UIColor redColor] backgroundColor:[UIColor whiteColor] forFlag:DDLogFlagDebug];[[DDTTYLogger sharedInstance] setForegroundColor:[UIColor cyanColor] backgroundColor:[UIColor blueColor] forFlag:DDLogFlagInfo];[[DDTTYLogger sharedInstance] setForegroundColor:[UIColor lightGrayColor] backgroundColor:[UIColor orangeColor] forFlag:DDLogFlagWarning];[[DDTTYLogger sharedInstance] setForegroundColor:[UIColor whiteColor] backgroundColor:[UIColor redColor] forFlag:DDLogFlagError];

注意:显示颜色是指针对XCode控制台的输出显示,还要结合插件XcodeColors(地址:);然后要增加如下的setenv代码,它的位置放在上面,否则将没有效果;

setenv("XcodeColors", "YES", 0);[DDLog addLogger:[DDTTYLogger sharedInstance]];

1.4:设置输出日志的格式

因为在输出时我们希望获得更多的信息,DDLog可以自定义设置一个格式,从而获得日志详细信息;下面这个类是我们项目中运用:

ZULoggerFormatter* formatter = [[ZULoggerFormatter alloc] init];[[DDTTYLogger sharedInstance] setLogFormatter:formatter]; //目前是在DDTTYLogger类型上显示,也可以加到输入到文件时

格式类:ZULoggerFormatter

@interface ZULoggerFormatter: NSObject
@end#import "ZULoggerFormatter.h"#import "NSDate+Utilities.h"@implementation ZULoggerFormatter {}- (NSString *)formatLogMessage:(DDLogMessage *)logMessage { NSString *logLevel = nil; switch (logMessage.flag) { case DDLogFlagError: logLevel = @"[ERROR]"; break; case DDLogFlagWarning: logLevel = @"[WARN]"; break; case DDLogFlagInfo: logLevel = @"[INFO]"; break; case DDLogFlagDebug: logLevel = @"[DEBUG]"; break; default: logLevel = @"[VBOSE]"; break; } NSString *formatStr = [NSString stringWithFormat:@"%@ %@ [%@][line %ld] %@ %@", logLevel, [logMessage.timestamp stringWithFormat:@"yyyy-MM-dd HH:mm:ss.S"], logMessage.fileName, logMessage.line, logMessage.function, logMessage.message]; return formatStr;}@end

1.5 设置宏取代NSLog

#if Product || Local#define NSLog(...) DDLogVerbose(__VA_ARGS__)#define Log(...) DDLogVerbose(__VA_ARGS__)#else#define NSLog(...) {}#define Log(...) {}#endif#define LogError(...) DDLogError(__VA_ARGS__)

这样就可以把项目中那些NSLog也替换成DDLogVerbose级别的错误;

1.6 设置不同环境输出日志等级

#if Product ||Localstatic const int ddLogLevel = LOG_LEVEL_VERBOSE;#elsestatic const int ddLogLevel = LOG_LEVEL_ERROR;#endif

1.7 设置输出到文件

- (DDFileLogger *)fileLogger{    if (!_fileLogger) {        DDFileLogger *fileLogger = [[DDFileLogger alloc] init];        fileLogger.rollingFrequency = 60 * 60 * 24; // 24 hour rolling        fileLogger.logFileManager.maximumNumberOfLogFiles = 7;                _fileLogger = fileLogger;    }    return _fileLogger;}

如果没有设置,它是有提供相应的默认值:

unsigned long long const kDDDefaultLogMaxFileSize      = 1024 * 1024;      // 1 MB  一个文件大小NSTimeInterval     const kDDDefaultLogRollingFrequency = 60 * 60 * 24;     // 24 Hours  一天NSUInteger         const kDDDefaultLogMaxNumLogFiles   = 5;                // 5 Files  五个unsigned long long const kDDDefaultLogFilesDiskQuota   = 20 * 1024 * 1024; // 20 MB  总共

如果有存储路径(可以设置paths):

NSString *appName = [[NSProcessInfo processInfo] processName];NSArray *paths = NSSearchPathForDirectoriesInDomains(NSLibraryDirectory, NSUserDomainMask, YES);NSString *basePath = ([paths count] > 0) ? paths[0] : NSTemporaryDirectory();NSString *logsDirectory = [[basePath stringByAppendingPathComponent:@"Logs"] stringByAppendingPathComponent:appName];

1.8 分享项目用到的日志管理类

#import 
#import
#import "ZULoggerFormatter.h"@interface MyFileLogger : NSObject@property (nonatomic, strong, readwrite) DDFileLogger *fileLogger;+(MyFileLogger *)sharedManager;@end#import "MyFileLogger.h"@implementation MyFileLogger#pragma mark - Inititlization- (instancetype)init{ self = [super init]; if (self) { [self configureLogging]; } return self;}#pragma mark 单例模式static MyFileLogger *sharedManager=nil;+(MyFileLogger *)sharedManager{ static dispatch_once_t once; dispatch_once(&once, ^{ sharedManager=[[self alloc]init]; }); return sharedManager;}#pragma mark - Configuration- (void)configureLogging{ setenv("XcodeColors", "YES", 0); [DDLog addLogger:[DDASLLogger sharedInstance]]; [DDLog addLogger:[DDTTYLogger sharedInstance]]; [[DDTTYLogger sharedInstance] setColorsEnabled:YES]; [[DDTTYLogger sharedInstance] setForegroundColor:[UIColor blueColor] backgroundColor:nil forFlag:DDLogFlagInfo]; [[DDTTYLogger sharedInstance] setForegroundColor:[UIColor purpleColor] backgroundColor:nil forFlag:DDLogFlagDebug]; [[DDTTYLogger sharedInstance] setForegroundColor:[UIColor redColor] backgroundColor:nil forFlag:DDLogFlagError]; [[DDTTYLogger sharedInstance] setForegroundColor:[UIColor greenColor] backgroundColor:nil forFlag:DDLogFlagVerbose]; ZULoggerFormatter* formatter = [[ZULoggerFormatter alloc] init]; [[DDTTYLogger sharedInstance] setLogFormatter:formatter]; [DDLog addLogger:self.fileLogger];}#pragma mark - Getters- (DDFileLogger *)fileLogger{ if (!_fileLogger) { DDFileLogger *fileLogger = [[DDFileLogger alloc] init]; fileLogger.rollingFrequency = 60 * 60 * 24; // 24 hour rolling fileLogger.logFileManager.maximumNumberOfLogFiles = 7; _fileLogger = fileLogger; } return _fileLogger;}@end

 

二:知识点

2.1 关于等级包含的设置,DDLogLevelAll显示所有,基它则依次降底跟相互包含;可以通过这个代码了解到枚举的设置;

typedef NS_OPTIONS(NSUInteger, DDLogFlag){    /**     *  0...00001 DDLogFlagError     */    DDLogFlagError      = (1 << 0),        /**     *  0...00010 DDLogFlagWarning     */    DDLogFlagWarning    = (1 << 1),        /**     *  0...00100 DDLogFlagInfo     */    DDLogFlagInfo       = (1 << 2),        /**     *  0...01000 DDLogFlagDebug     */    DDLogFlagDebug      = (1 << 3),        /**     *  0...10000 DDLogFlagVerbose     */    DDLogFlagVerbose    = (1 << 4)};/** *  Log levels are used to filter out logs. Used together with flags. */typedef NS_ENUM(NSUInteger, DDLogLevel){    /**     *  No logs     */    DDLogLevelOff       = 0,        /**     *  Error logs only     */    DDLogLevelError     = (DDLogFlagError),        /**     *  Error and warning logs     */    DDLogLevelWarning   = (DDLogLevelError   | DDLogFlagWarning),        /**     *  Error, warning and info logs     */    DDLogLevelInfo      = (DDLogLevelWarning | DDLogFlagInfo),        /**     *  Error, warning, info and debug logs     */    DDLogLevelDebug     = (DDLogLevelInfo    | DDLogFlagDebug),        /**     *  Error, warning, info, debug and verbose logs     */    DDLogLevelVerbose   = (DDLogLevelDebug   | DDLogFlagVerbose),        /**     *  All logs (1...11111)     */    DDLogLevelAll       = NSUIntegerMax};

增加相应的宏进行处理

#define NSLogError(frmt, ...)    do{ if(DD_NSLOG_LEVEL >= 1) NSLog((frmt), ##__VA_ARGS__); } while(0)#define NSLogWarn(frmt, ...)     do{ if(DD_NSLOG_LEVEL >= 2) NSLog((frmt), ##__VA_ARGS__); } while(0)#define NSLogInfo(frmt, ...)     do{ if(DD_NSLOG_LEVEL >= 3) NSLog((frmt), ##__VA_ARGS__); } while(0)#define NSLogDebug(frmt, ...)    do{ if(DD_NSLOG_LEVEL >= 4) NSLog((frmt), ##__VA_ARGS__); } while(0)#define NSLogVerbose(frmt, ...)  do{ if(DD_NSLOG_LEVEL >= 5) NSLog((frmt), ##__VA_ARGS__); } while(0)

2.2:进程类NSProcessInfo方法

+(NSProcessInfo*)processInfo  //返回当前进程的信息-(NSArray*)arguments  //以NSString对象数组的形式返回当前进程的参数-(NSDictionary *)environment  //返回变量/值对词典,以描述当前的环境变量(比如PATH和HOME)及其值-(int)processIdentifier  //返回进程标识符,它是操作系统赋予进程的唯一数字,用于识别每个正在运行的进程-(NSString*)processName  //返回当前正在执行的进程名称-(NSString *)globallyUniqueString  //每次调用这个方法时,都返回不同的单值字符串,可以用这个字符串生成单值临时文件名-(NSString *)hostname  //返回主机系统的名称(在笔者的Mac OS x系统中,返回的是mac-mato-ipad.local)-(NSUInteger)operatingSystem  //返回表示操作系统的数字(在笔者的Mac OS x系统中,返回的是5)-(NSString *)operatingSystemName  //返回操作系统的名称(笔者的Mac OS x系统中返回NSMACHOperatingSystem,可能返回的值定义在NSProgressInfo.h文件中)-(NSString *)operatingSystemVersionString  //返回操作系统的当前版本(笔者的Mac OS x系统中返回Version 10.7.5 (Build 11G56))-(void)setProcessName:(NSString *)name  //将当前进程名称设置为name。应该谨慎地使用这个方法,应为关于进程名称存在一些假设(比如用户默认的设置)
例如:NSString *appName = [[NSProcessInfo processInfo] processName];

2.3: lengthOfBytesUsingEncoding:NSUTF8StringEncoding

用于计算含有中英文的字符串长度,包含一个中文字用上面的方法时会转化成三个字节,其它一个字节;int len = [textField.text lengthOfBytesUsingEncoding:NSUTF8StringEncoding];

 

 

转载地址:http://rytwl.baihongyu.com/

你可能感兴趣的文章
视频干扰现象及其原因分析
查看>>
科技部再公布网络安全等10项国家重点研发计划
查看>>
《编程原本 》一1.8 总结
查看>>
剖析云计算和大数据落地后x86服务器的业务痛点
查看>>
贵阳打出大数据战略组合拳
查看>>
企业从信息化角度解读智慧城市,难以根治城市病
查看>>
硅谷初创企业控制成本 裁员风渐起
查看>>
油耗虚高保养贵,便宜车就活该问题多多?
查看>>
REC Solar推出黑色多晶半切片PERC组件,已进入量产化
查看>>
MapXtreme 2005 学习心得 了解新建MapXtreme项目结构(二)
查看>>
CIO如何做好灾难恢复/数据外泄的业务连续性计划?
查看>>
NI强化半导体测试布局 弹性/高性价比打败不景气
查看>>
深度解析服务器需要虚拟化的两大条件
查看>>
Salesforce:下个财年营收我们有望突破100亿美元
查看>>
是德科技发力5G测试测量 欲攻占市场领导地位
查看>>
大数据时代,CRM帮助企业进行升级转型
查看>>
是德科技成功开发广泛的测试与测量产品
查看>>
深圳465亿建11代生产线,TCL三星带头认购股权
查看>>
Solaris 上网配置
查看>>
谭晓生:如何面对IoT时代的安全新挑战?
查看>>