CocoaLumberjack
刚学iOS时候,调试找问题的时候一般就两种方式.
1.输出NSLog日志。
2.打断点,一步一步查看问题,查找崩溃点所在的方法,再进一步查看崩溃具体原因,稍微高级一点的就在控制台用命令打印各种参数。
现在看看实在是没什么技术含量,知道我遇到了她-[CocoaLumberjack](https://github.com/CocoaLumberjack/CocoaLumberjack)
先来看看她有什么高级的?
1.简单
CocoaLumberjack集成简单,可以方便的添加进工程,并且DDLog宏与系统的NSLog用法,格式相同,使用简单,不会有难度。
2.快速
在大多数用例中,CocoaLumberjack比NSLog执行快了一个数量级。
3.CocoaLumberjack与Xcode插件XcodeColors 配合,可实现控制台日志的彩色输出。
4.一个日志可以发送到多个logger,可以显示在控制台,可以存储在数据库,本地文件中,还可以上传服务器,满足我们的多样需求。
5.自定义日志。
我们可以根据系统的运行环境,定义不同级别的日志,自定义日志的格式,颜色,存储的日志文件的周期,文件最大个数,文件大小等等。
如何使用 ?
- 添加CocoaLumberjack到工程。
- 配置你的专属log系统
- 替换NSLog,玩转DDLog。
把Lumberjack框架添加到你的项目
CocoaLumberjack包含几个对象分别可以把Log输出到不同的地方:
1.DDASLLogger -发送日志语句到苹果的日志系统,它们显示在Console.app上
2.DDTTYLoyger -发送日志到控制台
3.DDFIleLoger -发送日志到文件。
4.DDAbstractDatabaseLogger -发送到DB
通过ddLogLevel定义日志等级:
typedef NS_ENUM(NSUInteger, DDLogLevel) {
DDLogLevelOff = 0,
DDLogLevelError = (DDLogFlagError), // 0...00001
DDLogLevelWarning = (DDLogLevelError | DDLogFlagWarning), // 0...00011
DDLogLevelInfo = (DDLogLevelWarning | DDLogFlagInfo), // 0...00111
DDLogLevelDebug = (DDLogLevelInfo | DDLogFlagDebug), // 0...01111
DDLogLevelVerbose = (DDLogLevelDebug | DDLogFlagVerbose), // 0...11111
DDLogLevelAll = NSUIntegerMax // 1111....11111 (DDLogLevelVerbose plus any other flags)
};
相信大家差不多都能看懂,它们是一种包含的枚举。
- DDLogLevelOff ,关闭所有日志
- DDLogLevelError,只打印error 级别的日志
- DDLogLevelWarning ,打印error,warning级别的日志
- DDLogFlagInfo,打印error,warning,Info级别的日志
- DDLogLevelDebug,打印error,warning,Info,debug级别的日志
- DDLogFlagVerbose,打印error,warning,Info,debug,verbose级别的日志
- DDLogLevelAll,打印所有日志,不知包含上述几种,还有其他级别的日志。
接下来配置我们的专属log系统
- 自定义日志格式。
新建WJFormatter 继承自NSObject,遵循DDLogMatter协议,并实现其协议方法,-(NSString )formatLogMessage:(DDLogMessage )logMess
{
NSString *loglevel = nil;
switch (logMessage.flag)
{
case LOG_FLAG_ERROR:
{
loglevel = @"[ERROR]->";
}
break;
case LOG_FLAG_WARN:
{
loglevel = @"[WARN]-->";
}
break;
case LOG_FLAG_INFO:
{
loglevel = @"[INFO]--->";
}
break;
case LOG_FLAG_DEBUG:
{
loglevel = @"[DEBUG]---->";
}
break;
case LOG_FLAG_VERBOSE:
{
loglevel = @"[VBOSE]----->";
}
break;
default:
break;
}
NSString *formatStr = [NSString stringWithFormat:@"%@ %@___line[%ld]__%@", loglevel, logMessage->_function,logMessage->_line, logMessage->_message];
return formatStr;
}
自定义日志发送策略,及各级别日志显示颜色。
我的做法是新建一个DDLogManager 单例类来负责管理DDLog的个性化配置。自定义打印日志级别。
同样在DDLogManager里边写一个宏定义。
#if DEBUG
static const DDLogLevel ddLogLevel = DDLogLevelVerbose;
#else
static const DDLogLevel ddLogLevel = DDLogLevelError;
#endif
在DEBUG模式下打印DDLogLevelVerbose级别日志,RELEASE模式下只打印DDLogLevelError级别日志。注意:ddLogLevel名字不要自己定义,否则出错。
/**配置日志信息*/
- (void)config
{
WJLogFormatter *logFormatter = [[WJLogFormatter alloc] init];
//1.发送日志语句到苹果的日志系统,它们显示在Console.app上
// [[DDASLLogger sharedInstance] setLogFormatter:logFormatter];
// [DDLog addLogger:[DDASLLogger sharedInstance]];//
//2.把输出日志写到文件中
DDFileLogger *fileLogger = [DDLogManager shareInstence].fileLogger;
[fileLogger setLogFormatter:logFormatter];
[DDLog addLogger:fileLogger withLevel:DDLogLevelError];//错误的写到文件中
//3.初始化DDLog日志输出,在这里,我们仅仅希望在xCode控制台输出
[[DDTTYLogger sharedInstance] setLogFormatter:logFormatter];
[[DDTTYLogger sharedInstance] setColorsEnabled:YES];// 启用颜色区分
[[DDTTYLogger sharedInstance] setForegroundColor:DDMakeColor(255, 0, 0)
backgroundColor:nil
forFlag:DDLogFlagError];
[[DDTTYLogger sharedInstance] setForegroundColor:DDMakeColor(125,200,80)
backgroundColor:nil
forFlag:DDLogFlagInfo];
[[DDTTYLogger sharedInstance] setForegroundColor:DDMakeColor(200,100,200)
backgroundColor:nil
forFlag:DDLogFlagDebug];
[DDLog addLogger:[DDTTYLogger sharedInstance]];//
//4.添加数据库输出
// DDAbstractLogger *dateBaseLogger = [[DDAbstractLogger alloc] init];
// [dateBaseLogger setLogFormatter:logFormatter];
// [DDLog addLogger:dateBaseLogger];
}
/**
* 初始化
*
* @return 日志系统管理器对象
*/
+(instancetype)shareInstence
{
static DDLogManager *logmanager = nil;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
logmanager = [[self alloc] init];
});
return logmanager;
}
-(instancetype)init
{
self = [super init];
if (self)
{
self.fileLogger = [[DDFileLogger alloc] init];
self.fileLogger.rollingFrequency = 60 * 60 * 24; // 24 hour rolling
self.fileLogger.logFileManager.maximumNumberOfLogFiles = 7;
self.fileLogger.maximumFileSize = 1024 * 1024 * 2;
}
return self;
}
config方法里边不必不必全写,根据自己的要求添加要用的日志发送策略即可。
另可根据喜好设置不同级别日志的颜色,方便在控制台查找。
DDLog默认的文件管理器,iPhone的话,日志文件是存放在~/Library/Caches/Logs.文件夹中。
log文件命名如 "<bundle identifier> <date> <time>.log"
故我们通过如下方法取日志文件路径。
/*获得系统日志的路径**/
-(NSArray*)getLogPath
{
NSString *docPath = [NSSearchPathForDirectoriesInDomains(NSLibraryDirectory, NSUserDomainMask, YES) objectAtIndex:0];
NSString * logPath = [docPath stringByAppendingPathComponent:@"Caches"];
logPath = [logPath stringByAppendingPathComponent:@"Logs"];
NSFileManager * fileManger = [NSFileManager defaultManager];
NSError * error = nil;
NSArray * fileList = [[NSArray alloc]init];
fileList = [fileManger contentsOfDirectoryAtPath:logPath error:&error];
NSMutableArray * listArray = [[NSMutableArray alloc]init];
for (NSString * oneLogPath in fileList)
{
//带有工程名前缀的路径才是我们存储的日志路径
if([oneLogPath hasPrefix:[NSBundle mainBundle].bundleIdentifier])
{
NSString * truePath = [logPath stringByAppendingPathComponent:oneLogPath];
[listArray addObject:truePath];
}
}
return listArray;
}
-当然这是默认的存储区域,如果自定义一个文件管理器类继承自DDFileManager ,重写存储方法,读取方法相应也要改变。
最后我们就可以用DDLog来替换工程中的NSLog了.
使用不同的宏打印不同级别的Log
- DDLogError(frmt, …) 打印Error级别的Log
- DDLogWarn(frmt, …) 打印Warn级别的Log
- DDLogInfo(frmt, …) 打印Info级别的Log
- DDLogDebug(frmt, …) 打印Debug级别的Log
- DDLogVerbose(frmt, …) 打印Verbose级别的Log
到这里控制台彩色日志还没有实现,因为还要用到之前提到的XcodeColors插件.
时间紧急,链接有空再加。
下面还需一步(见截图):
“YES”不要写成”Yes”,或其他,否则还是没有效果。
[真机调试的时候可能会收到内存警告,建议连接真机及上线打包时去掉这一项]。
OK,That’s all.
实验一把,
相比NSLog,是不是瞬间有种高大上的感觉。
事实上也确实是,如果你正在寻找一个app企业级的日志框架,如果你还在为偶尔出现,重复困难的bug烦恼,不妨试试CocoaLumberjack。
扩展阅读:// http://blog.csdn.net/zhonggaorong/article/details/51656169
CocoaLumberjack的更多相关文章
- iOS开发之CocoaLumberjack
Cocoa LumberJack是一个功能强大的NSlog,是通用的Cocoa日志框架之一.它可以提供更高级的log功能,比如记录log至文件或网络,并可根据log的级别(info.debug.war ...
- (20160604)开源第三方学习之CocoaLumberjack
CocoaLumberjack是一个很好用的日志打印工具,它可以帮助我们把工程中的日志信息打印到终端或者输出到文件中. 地址:https://github.com/CocoaLumberjack/Co ...
- 【iOS】XcodeColors插件与CocoaLumberjack工具
工欲善其事必先利其器,好的开发者一定是懂得利用工具来提高自己的效率的,Xcode有很多第三方插件可以使用,最近发现一个可以给控制台着色的工具XcodeColors,结合CocoaLumberjack一 ...
- CocoaLumberjack+XcodeColor(输出带有颜色的日志)在安装过程中遇到的问题
在安装的时候遇到了各种坑,(在这里用到的pch文件的使用以及解决无法引入的问题,可以参考上午的文章) 一(XcodeColor的安装).在github上下载XcodeClolor的插件,并且安装,Xc ...
- CocoaLumberjack——带颜色的Log
CocoaLumberjack可以带颜色Log,具体的好处嘛,谁用谁知道,:] 具体步骤如下: 1. 安装XcodeColors插件 下载地址:https://github.com/robbiehan ...
- iOS开源项目之日志框架CocoaLumberjack
CocoaLumberjack是Mac和iOS上一个集快捷.简单.强大和灵活于一身的日志框架.CocoaLumberjack类似于流行的日志框架(如log4j),但它是专为Objective-C设计的 ...
- 【转】CocoaLumberjack——带颜色的Log
CHENYILONG Blog [转]CocoaLumberjack--带颜色的Log - 趣味苹果开发 - 博客园 转自:趣味苹果开发 CocoaLumberjack--带颜色的Log Coco ...
- iOS开发进阶 - 日志输出框架CocoaLumberjack与XcodeColors插件的简单使用(swift版)
CocoaLumberjack是Mac和iOS上一个集快捷.简单.强大和灵活于一身的日志框架.XcodeColors是用于控制台着色的工具,配合着CocoaLumberjack用有更好的效果,不废话, ...
- 利用CocoaLumberjack框架+XcodeColors插件,调试输出有彩色的信息
效果如下: 步骤: 1. 安装Xcode插件:XcodeColors(方法请参考这里) 2. 为项目添加 CocoaLumberjack 框架(方法请参考这里) 3. 添加代码 (1) 为项目添加 p ...
随机推荐
- eclipse/myeclipse下简单更改tomcat的启动等待时间
1.双击server 2.更改timeout
- Day_6作业_模拟人生
as #!/usr/bin/env python # encoding: utf-8 class wisdom(object): def __init__(self,n,g): self.n = n ...
- 面向对象_python
面向对象_python 类(Class): 用来描述具有相同的属性和方法的对象的集合.它定义了该集合中每个对象所共有的属性和方法.对象是类的实例. 类变量:类变量在整个实例化的对象中是公用的.类变量定 ...
- RPCL(Rival Penalized Competitive Learning)在matlab下的实现
RPCL是在线kmeans的改进版,相当于半自动的选取出k个簇心:一开始设定N个簇心,N>k,然后聚类.每次迭代中把第二近的簇心甩开一段距离. 所谓在线kmeans是就是,每次仅仅用一个样本来更 ...
- 【BZOJ-3450】Tyvj1952Easy 概率与期望DP
3450: Tyvj1952 Easy Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 468 Solved: 353[Submit][Status] ...
- BZOJ1024 [SCOI2009]生日快乐
本文版权归ljh2000和博客园共有,欢迎转载,但须保留此声明,并给出原文链接,谢谢合作. 本文作者:ljh2000作者博客:http://www.cnblogs.com/ljh2000-jump/转 ...
- css选择器(选择<div>内所有<p>元素)
情况1:<div><p></div> 情况2:<div><a><p></p></a></div&g ...
- iOS应用第三方推送的添加
现在的一些第三方的推送平台挺好用,主要是因为他们有类似微信公众平台一样的管理后台,简单易用,封装了很多开发者需要的推送功能. 下面以个推为例: 1.在个推的应用配置iOS部分设置自己的BounleID ...
- InternalsVisibleToAttribute——把internal成员暴露给指定的友元程序集
友元程序集简介 我们知道一个类中被定义为internal的成员(包括类型.方法.属性.变量.事件)是只能在同一个程序集中被访问到的(当然了,我这里说的是正常的方式,不包括通过反射来访问).这个规则在. ...
- 使用面向对象对XML进行解析:dom和dom4j的用法
这是一个比较简单的例子,主要是运用面向对象的思想,对XML文件进行解析,用dom和dom4j方法 <?xml version="1.0" encoding="utf ...