(20160604)开源第三方学习之CocoaLumberjack
CocoaLumberjack是一个很好用的日志打印工具,它可以帮助我们把工程中的日志信息打印到终端或者输出到文件中。
地址:https://github.com/CocoaLumberjack/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_ERROR
LOG_LEVEL_INFO:包括:LOG_LEVEL_WARN
LOG_LEVEL_DEBUG:包括:LOG_LEVEL_INFO
LOG_LEVEL_VERBOSE:包括:LOG_LEVEL_DEBUG
LOG_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(地址:https://github.com/robbiehanson/XcodeColors);然后要增加如下的setenv代码,它的位置放在上面,否则将没有效果;
setenv("XcodeColors", "YES", );
[DDLog addLogger:[DDTTYLogger sharedInstance]];
1.4:设置输出日志的格式
因为在输出时我们希望获得更多的信息,DDLog可以自定义设置一个格式,从而获得日志详细信息;下面这个类是我们项目中运用:
ZULoggerFormatter* formatter = [[ZULoggerFormatter alloc] init];
[[DDTTYLogger sharedInstance] setLogFormatter:formatter]; //目前是在DDTTYLogger类型上显示,也可以加到输入到文件时
格式类:ZULoggerFormatter
@interface ZULoggerFormatter: NSObject<DDLogFormatter>
@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 ||Local
static const int ddLogLevel = LOG_LEVEL_VERBOSE;
#else
static const int ddLogLevel = LOG_LEVEL_ERROR;
#endif
1.7 设置输出到文件
- (DDFileLogger *)fileLogger
{
if (!_fileLogger) {
DDFileLogger *fileLogger = [[DDFileLogger alloc] init];
fileLogger.rollingFrequency = * * ; // 24 hour rolling
fileLogger.logFileManager.maximumNumberOfLogFiles = ; _fileLogger = fileLogger;
}
return _fileLogger;
}
如果没有设置,它是有提供相应的默认值:
unsigned long long const kDDDefaultLogMaxFileSize = * ; // 1 MB 一个文件大小
NSTimeInterval const kDDDefaultLogRollingFrequency = * * ; // 24 Hours 一天
NSUInteger const kDDDefaultLogMaxNumLogFiles = ; // 5 Files 五个
unsigned long long const kDDDefaultLogFilesDiskQuota = * * ; // 20 MB 总共
如果有存储路径(可以设置paths):
NSString *appName = [[NSProcessInfo processInfo] processName];
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSLibraryDirectory, NSUserDomainMask, YES);
NSString *basePath = ([paths count] > ) ? paths[] : NSTemporaryDirectory();
NSString *logsDirectory = [[basePath stringByAppendingPathComponent:@"Logs"] stringByAppendingPathComponent:appName];
1.8 分享项目用到的日志管理类
#import <Foundation/Foundation.h>
#import <CocoaLumberjack.h>
#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", );
[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 = * * ; // 24 hour rolling
fileLogger.logFileManager.maximumNumberOfLogFiles = ; _fileLogger = fileLogger;
} return _fileLogger;
}
@end
二:知识点
2.1 关于等级包含的设置,DDLogLevelAll显示所有,基它则依次降底跟相互包含;可以通过这个代码了解到枚举的设置;
typedef NS_OPTIONS(NSUInteger, DDLogFlag){
/**
* 0...00001 DDLogFlagError
*/
DDLogFlagError = ( << ),
/**
* 0...00010 DDLogFlagWarning
*/
DDLogFlagWarning = ( << ),
/**
* 0...00100 DDLogFlagInfo
*/
DDLogFlagInfo = ( << ),
/**
* 0...01000 DDLogFlagDebug
*/
DDLogFlagDebug = ( << ),
/**
* 0...10000 DDLogFlagVerbose
*/
DDLogFlagVerbose = ( << )
};
/**
* Log levels are used to filter out logs. Used together with flags.
*/
typedef NS_ENUM(NSUInteger, DDLogLevel){
/**
* No logs
*/
DDLogLevelOff = ,
/**
* 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];
(20160604)开源第三方学习之CocoaLumberjack的更多相关文章
- (20160602)开源第三方学习之SDWebImage
这个类库提供一个UIImageView类别以支持加载来自网络的远程图片.具有缓存管理.异步下载.同一个URL下载次数控制和优化等特征. 地址:https://github.com/rs/SDWebIm ...
- (20160601)开源第三方学习之SVProgressHUD
SVProgressHUD相信在很多项目中都有运用,运用于弹出窗提示效果: 地址:https://github.com/SVProgressHUD/SVProgressHUD 一:插件的运用 1.1 ...
- (20170207)开源第三方学习之JSONModel
1:仓库地址:https://github.com/jsonmodel/jsonmodel 主要作用是把JSON字符串转成Model实体,也可以把实体转化成JSON字符串:还包含一些转字典的内容: ...
- 开源深度学习架构Caffe
Caffe 全称为 Convolutional Architecture for Fast Feature Embedding,是一个被广泛使用的开源深度学习框架(在 TensorFlow 出现之前一 ...
- GitHub 上 57 款最流行的开源深度学习项目
转载:https://www.oschina.net/news/79500/57-most-popular-deep-learning-project-at-github GitHub 上 57 款最 ...
- 转:从开源项目学习 C 语言基本的编码规则
从开源项目学习 C 语言基本的编码规则 每个项目都有自己的风格指南:一组有关怎样为那个项目编码约定.一些经理选择基本的编码规则,另一些经理则更偏好非常高级的规则,对许多项目而言则没有特定的编码规则,项 ...
- 推荐GitHub上10 个开源深度学习框架
推荐GitHub上10 个开源深度学习框架 日前,Google 开源了 TensorFlow(GitHub),此举在深度学习领域影响巨大,因为 Google 在人工智能领域的研发成绩斐然,有着雄厚 ...
- Computational Network Toolkit (CNTK) 是微软出品的开源深度学习工具包
Computational Network Toolkit (CNTK) 是微软出品的开源深度学习工具包 用 CNTK 搞深度学习 (一) 入门 Computational Network Toolk ...
- 谷歌重磅开源强化学习框架Dopamine吊打OpenAI
谷歌重磅开源强化学习框架Dopamine吊打OpenAI 近日OpenAI在Dota 2上的表现,让强化学习又火了一把,但是 OpenAI 的强化学习训练环境 OpenAI Gym 却屡遭抱怨,比如不 ...
随机推荐
- 第3/24周 区_SQL Server中管理空间的基本单位
哇哦,SQL Server性能调优培训已经进入第3周了!同时你已经对SQL Server内核运行机制有了很好的认识.今天我会讲下SQL Server中的区管理,因为这是个很重要的话题,我们会在第23周 ...
- Winform如何实现ComboBox模糊查询
最近朋友问了一个关于Winform实现ComboBox模糊查询的知识点,自己好久没有搞Winform了,就上手练了一下,废话不多说,进入正题. 前台设计: 前台就是一个简单的Form窗体+一个Comb ...
- Asp.net(C#) windows 服务{用于实现计划任务,事件监控等}
什么是windows服务? 一个Windows服务程序是在Windows操作系统下能完成特定功能的可执行的应用程序.Windows服务程序虽然是可执行的,但是它不像一般的可执行文件通过双击就 ...
- 【转】jQuery中.bind() .live() .delegate() .on()的区别
bind(type,[data],fn) 为每个匹配元素的特定事件绑定事件处理函数 $("a").bind("click",function(){alert(& ...
- 【转】关于redis.conf的参数配置
1. Redis默认不是以守护进程的方式运行,可以通过该配置项修改,使用yes启用守护进程 daemonize no 2. 当Redis以守护进程方式运行时,Redis默认会把pid写入/var/ru ...
- [Asp.net 5] DependencyInjection项目代码分析4-微软的实现(1)
前面俩种实现中,很多内部细节都无法知道,微软的框架也是为了屏蔽具体实现,只让我们关注接口.但是人都是充满好奇的,依赖注入到底是怎么实现的呢? 微软又有怎样的实现呢?下面就为大家一一呈现(说实话,代码真 ...
- Mac OS 的一点历史: Mac OS, Mac OSX 与Darwin
作为收购 NeXT 公司的结果,苹果公司获得了 NeXTSTEP 架构中的 Mach 和 Objective-C 等设计.尽管 NeXTSTEP 本身已经不再发展了,但是其中的组件在 OS X 中获得 ...
- Castle ActiveRecord框架学习(一)
一.Active Record(活动记录)模式 Active Record是业务逻辑层中(<企业应用架构模式>将该模式归为数据源模式)常用的一种框架模式,尤其在底层数据库模型匹配业务模型时 ...
- jquery可见性选择器(匹配匹配所有显示的元素)
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- Tigase数据库结构(1)
Tigase数据库有很多张表,其中最主要的是3张表:tig_users,tig_nodes和tig_pairs. 1.tig_users tig_users存储用户信息,有uid(主键,用户ID),u ...