如何添加cocoacocoa lumberjackk框架

IOS开发技巧(22)
源码地址:&
1.&CocoaLumberjack这个框架是做什么的?
&&CocoaLumberjack是Mac和iOS上一个集快捷、简单、强大和灵活于一身的日志框架。CocoaLumberjack类似于流行 的日志框架(如log4j),但它是专为Objective-C设计的,利用了多线程、GCD(如果可用)、无锁原子操作Objective-C运行时的 动态特性。
2.&CocoaLumberjack 它的优点有哪些?&
在大多数用例中,Lumberjack比NSLog快了一个数量级。
当应用程序启动时,只需一行加单的代码就可配置Lumberjack。然后用DDLog语句简单地取代NSLog语句,使用方法与NSLog完全一样
配置你自己想要的日志框架。修改每个文件的日志级别(尤其是测试时)。修改每个logger的日志级 别(详细的控制台,但是简洁的日志文件)。修改每个Xcode配置的日志级别。为你的应用程序定制日志级别的数量。添加自己的精细的日志。在运行时动态修 改日志级别。 选择如何以及何时回滚你的日志文件。将日志文件上传至中心服务器。压缩存档日志文件来节省硬盘空间,一个日志语句可以被发送到多个logger,意味着你可以同时记录文件和控制台。此外,还可以创建自己的logger,将日志语句发送到网络、数据库或者分布式文件系统中,日志保存方法十分灵活。
3.CocoaLumberjack的使用场景
1.跟踪在程序中不断出现的不可复制的bug;
2.对原声的系统日志感到失望
3.出于支持系统和稳定性的需要,你想将应用程序升级到下一级别;
4.为你的应用程序(Mac或者iPhone)寻找企业级的日志解决方案。
5. 自定义日志级别,查看对应安全级别的日志。
4.&CocoaLumberjack的使用
& & &1.配置
platform :ios, '8.0'
pod 'CocoaLumberjack'
github &CocoaLumberjack/CocoaLumberjack&
普通方式添加CocoaLumberjack
1. 下载下来源码
2. 把Lumberjack.xcodeproj添加到你的项目中,通过add file to 你的项目名
& & & & 3. 配置工程, 设置依赖
& & & & & &&
& & & & 4. &&Add&&$(BUILT_PRODUCTS_DIR)/include&&to
the&Header Search Paths
5. 现在在你的pch文件中 & &加上 &#import&CocoaLumberjack/CocoaLumberjack.h&
&,编译项目,应该是成功了。
2.&CocoaLumberjack的详细使用。
& & & &1.如果想要支持彩色日志效果,这儿需要用 package manager 装上XcodeColors这个插件。
& & &&2.认识下面几个常用的类&&
&1.DDLog(整个框架的基础)
& 2.DDASLLogger(发送日志语句到苹果的日志系统,以便它们显示在Console.app上)
& 3.DDTTYLoyger(发送日志语句到Xcode控制台,如果可用)
& 4.DDFIleLoger(把日志语句发送至文件)
& DDLog是强制性的,其余的都是可选的,这取决于你打算如何使用这个框架。例如,如果你不打算纪录到一个文件,你可以跳过DDFileLogger,或者你想跳过ASL以便更快的文件记录,你可以跳过DDASLLoger。
& & & &3. 开始在程序中进行设置。
& & & &&- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
// Override point for customization after application launch.
[DDLog addLogger:[DDASLLogger sharedInstance]];
[DDLog addLogger:[DDTTYLogger sharedInstance]];
return YES;
在程序最开始的运行的地方就进行一个log的初始化, 这样做的作用就是在你的日志框架中添加两个“logger”。也就是说你的日志语句将被发送到Console.app和Xcode控制 台(就像标准的NSLog)
& 如果你需要把这些日志添加到文件中,那么这个时候你就用到了DDFIleLoger。使用方法如下
DDFileLogger *fileLogger = [[DDFileLogger alloc] init];
//保存周期
fileLogger.rollingFrequency = 60 * 60 * 24; // 24 hour rolling
//最大的日志文件数量
fileLogger.logFileManager.maximumNumberOfLogFiles = 7;
[DDLog addLogger:fileLogger];
& & 4. 最重要的部分。&用DDLog替换NSLog语句
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:关闭日志
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:45746次
积分:1250
积分:1250
排名:千里之外
原创:64篇
转载:96篇
评论:14条
(6)(28)(26)(27)(12)(7)(14)(16)(18)(9)(3)(1)XMPPFramewok IOS 开发(一)——配置xcode - 刘可如 - 博客园
看了很多教程,有的很旧,有的写的太简单,而实际操作会出现很多编译报错,特此记下来供以后参考。
最好按照步骤一步步导入Framework,每做完一步都要编译一下,发现错误及时改正,否则到最后会很麻烦。
第一步 新建项目chatDemo
第二步 下载最新版XMPPFramewok
&地址:&/robbiehanson/XMPPFramework
第三步 在chatDemo目录下新建目录3rd,在3rd目录下新建XMPP目录,如图所示
第四步 添加CocoaLumberjack&日志框架
在XMPP目录下新建Vendor目录。
拷贝下载的&XMPPFramework&/Vendor/CocoaLumberjack&到Vendor目录下。
第五步 添加CocoaAsyncSocket&轻量级的网络框架
拷贝下载的&XMPPFramework&/Vendor/CocoaAsyncSocket&到Vendor目录下。
CocoaAsyncSocket 依赖 CFNetwork.framework 和 Security.framework,
所以需要在 TARGETS -& Build Phases -& Link Binary With Libraries 添加CFNetwork.framework和 Security.framework
第六步 添加KissXML&实体类框架
拷贝下载的&XMPPFramework&/Vendor/KissXML 到Vendor目录下。
KissXML 使用了 libxml2 解析 XML,所以
首先,我们需要在 TARGETS -& Build Phases -& Link Binary With Libraries 添加 libXML2.dylib
然后,在 TARGETS -& Build Settings -& Other Linker Flags 添加 -lxml2,
最后,在TARGETS -& Build Settings -& Header Search Paths 添加&/usr/include/libxml2
第七步 添加libidn
拷贝 &XMPPFramework&/Vendor/libidn 到Vendor下,添加静态库文件&libidn.a 和头文件&idn-int.h 和&stringprep.h
第八步 添加Authentication Categories Core 和 Utilities&
1.将源码目录下地Authentication Categories Core 和 Utilities 文件夹添加到项目文件夹XMPP下
2.在 TARGETS -& Build Phases -& Link Binary With Libraries 添加动态连接库 libresolv.dylib
第九步&添加XMPPFramework.h 到XMPP目录下
XMPPFramework.h 内容如下,可以根据自己的项目需要进行删改
#import "XMPP.h"
// List the modules you're using here.
#import "XMPPReconnect.h"
#import "XMPPRoster.h"
#import "XMPPRosterCoreDataStorage.h"
#import "XMPPvCardTempModule.h"
#import "XMPPvCardAvatarModule.h"
#import "XMPPvCardCoreDataStorage.h"
#import "XMPPCapabilities.h"
#import "XMPPCapabilitiesCoreDataStorage.h"
#import "XMPPMUC.h"
#import "XMPPRoomCoreDataStorage.h"
第十步 根据自己的项目需求添加&XMPPFramework&/Extensions 的扩展到XMPP目录下
在 TARGETS -& Build Phases -& Link Binary With Libraries 添加Extensions的依赖库:
CoreData.framework SystemConfiguration.framework CoreLocation.framework
如果项目没有使用ARC,编译之后可能会有很多ARC警告,
进行如下设置Edit -& Refactor -&&convert to Objective-C ARC
最后项目目录如下&&国之画&&&&&&
版权所有 京ICP备号-2
迷上了代码!iOS用CocoaLumberJack抓取crash日志上传 - 简书
下载简书移动应用
写了4827字,被1人关注,获得了4个喜欢
iOS用CocoaLumberJack抓取crash日志上传
会的不难,难的不会,这大概就是温习旧知识和学习新知识时的感受了吧。
这几天百度Debug日志管理,利用第三方库搭建自己的Log系统,本文记录一下学习使用CocoaLumberJack的过程。
最开始时设想的需求是:
可以积攒到一定量的Log,或者定期,一次性把存储的Log发送给服务器,不能打一个Log就发一次。
需要解决的问题有:
1.应该在什么地方打印Log才能记录下有用的信息,如果每个函数都打印,不仅繁琐而且杂乱的信息量过大;2.Log日志里面需要记录下哪些信息;3.清理过期无用的日志。4.在debug版中需要把日志打印到Xcode控制台便于查看,而在release版中不能在控制台中打印Log。
所幸找到了iOS上非常优秀的第三方日志管理库--。完全满足最开始设想的需求。
关于刚刚的问题:
1,在觉得有可能发生crash的地方,例如空值、数组越界、不存在方法的引用......只能说实践得真知,边做边看吧。2,打印 函数名、方法名、行号。3,CocoaLumberJack自动帮我们实现了日志的记录和删除。4,使用宏定义Debug开关。
关于CoCoaLumberJack的使用方法,还是先看github上的和吧。它可结合插件,让Xcode控制台打印的日志带上颜色。
CoCoaLumberJack的日志级别有如下几种:
LOG_LEVEL_ERROR:如果设置为LOG_LEVEL_ERROR,仅仅能看到Error相关的日志输出。
LOG_LEVEL_WARN:如果设置为LOG_LEVEL_WARN,能看到Error、Warn相关的日志输出。
LOG_LEVEL_INFO:如果设置为LOG_LEVEL_INFO,能够看到Error、Warn、Info相关的日志输出。
LOG_LEVEL_DEBUG:如果设置为LOG_LEVEL_DEBUG,能够看到Error/Warn/Info/Debug相关的日志输出。
LOG_LEVEL_VERBOSE:如果设置为LOG_FLAG_VERBOSE,能够看到所有级别的日志输出。
LOG_LEVEL_OFF:不输出日志。
DDLogLevel 定义了全局的 log 等级,DDLogFlag 是我们打 log 时设定的 log 等级,CocoaLumberjack 会比较两者,如果 flag 低于 level,则不会打 log:
那么开始我的实现过程
使用宏来处理,指定日志的记录级别创建一个PCH文件,并添加如下代码:'
#ifndef PrefixHeader_pch
#define PrefixHeader_pch
//定义并导入CoCoaLumberJack框架
#define LOG_LEVEL_DEF ddLogLevel
#import &CocoaLumberjack.h&
//通过DEBUG模式设置全局日志等级,DEBUG时为Verbose,所有日志信息都可以打印,否则Error,只打印
#ifdef DEBUG
static const DDLogLevel ddLogLevel = DDLogLevelV
static const DDLogLevel ddLogLevel = DDLogLevelE
#endif /* PrefixHeader_pch */
在代码中就可以使用DDLogError/DDLogWarn/DDLogDebug/DDLogVerbose来无缝替代NSLog,例如:
DDLogError(@"[Error]:%@", @"输出错误信息");//输出错误信息
DDLogWarn(@"[Warn]:%@", @"输出警告信息");//输出警告信息
DDLogInfo(@"[Info]:%@", @"输出描述信息");//输出描述信息
DDLogDebug(@"[Debug]:%@", @"输出调试信息");//输出调试信息
DDLogVerbose(@"[Verbose]:%@", @"输出详细信息");//输出详细信息
但是这样并不能满足我们打印文件名、函数名、行号的需求,于是,在PCH文件中,再次宏定义一下,例如DDLogError:
#ifdef DEBUG
#define DLog(format, ...) DDLogError((@"[文件名:%s]" "[函数名:%s]" "[行号:%d]" format), __FILE__, __FUNCTION__, __LINE__, ##__VA_ARGS__);
#define DLog(...);
这样我们可以用DLog替代DDLogError打印,并且每次都会自动打印出文件名、函数名、行号信息。
DLog(@"User selected file:%@ withSize:%d", @"filePath", 123);
控制台输出:
[fg214,57,30; 01:17:22:443 MD5[4] [文件名:/Users/lg/Desktop/Log/Log/ViewController.m][函数名:-[ViewController viewDidLoad]][行号:31]User selected file:filePath withSize:123
把CocoaLumberjack框架添加到你的项目
需要添加的主要文件有四个:1.@DDLog(整个框架的基础)2.@DDASLLogger(发送日志语句到苹果的日志系统,以便它们显示在Console.app上)3.@DDTTYLoyger(发送日志语句到Xcode控制台,如果可用)4.@DDFIleLoger(把日志语句发送至文件)
DDLog是强制性的,其余的都是可选的,这取决于你打算如何使用这个框架。例如,如果你不打算纪录到一个文件,你可以跳过DDFileLogger,或者你想跳过ASL以便更快的文件记录,你可以跳过DDASLLoger。
需要注意的是:
在使用DDLogError或者DLog之前,首先得在application:didFinishLaunchingWithOptions:方法中配置这个日志框架:
//开始时,你需要下面两行代码:
[DDLog addLogger:[DDASLLogger sharedInstance]];
[DDLog addLogger:[DDTTYLogger sharedInstance]];
//这将在你的日志框架中添加两个“logger”。也就是说你的日志语句将被发送到Console.app和Xcode控制 台(就像标准的NSLog)
//这个框架的好处之一就是它的灵活性,如果你还想要你的日志语句写入到一个文件中,你可以添加和配置一个file logger:
fileLogger = [[DDFileLogger alloc] init];
fileLogger.rollingFrequency = 60 * 60 * 24; // 24 hour rolling
fileLogger.logFileManager.maximumNumberOfLogFiles = 7;
[DDLog addLogger:fileLogger];
//上面的代码告诉应用程序要在系统上保持一周的日志文件。
//如果不设置rollingFrequency和maximumNumberOfLogFiles,
//则默认每天1个Log文件、存5天、单个文件最大1M、总计最大20M,否则自动清理最前面的记录。
接下来上传,可以从 protocol下面的两个协议中获取Log文件rolling时的通知,便可以在此时将Log文件上传:
//Notifications from DDFileLogger
- (void)didArchiveLogFile:(NSString *)logFileP
- (void)didRollAndArchiveLogFile:(NSString *)logFileP
但是我并没有这样做,因为后来发现一个问题:
即使记录了很多Log文件,依然不知道在程序有没有崩溃过。如果根据最开始的设想,上传了那么多Log文件,根本不可能一个个的去看它们的Log文件是否有崩溃信息。而CocoaLumberJack只会记录下我们主动打印过的信息,而不会抓取、记录下苹果自带的crash信息,更不会在下一次程序启动时通知我们程序是否崩溃过。
所以,我们需要抓取苹果自带的crash信息,借鉴网上的方法,
新建一个CatchCrash类:CatchCrash.h
#import &Foundation/Foundation.h&
@interface CatchCrash : NSObject
void uncaughtExceptionHandler(NSException *exception);
CatchCrash.m
#import "CatchCrash.h"
#import "PrefixHeader.pch"
@implementation CatchCrash
//在AppDelegate中注册后,程序崩溃时会执行的方法
void uncaughtExceptionHandler(NSException *exception)
//获取系统当前时间,(注:用[NSDate date]直接获取的是格林尼治时间,有时差)
NSDateFormatter *formatter =[[NSDateFormatter alloc] init];
[formatter setDateFormat:@"yyyy-MM-dd HH:mm:ss"];
NSString *crashTime = [formatter stringFromDate:[NSDate date]];
//异常的堆栈信息
NSArray *stackArray = [exception callStackSymbols];
//出现异常的原因
NSString *reason = [exception reason];
//异常名称
NSString *name = [exception name];
//拼接错误信息
NSString *exceptionInfo = [NSString stringWithFormat:@"crashTime: %@ Exception reason: %@\nException name: %@\nException stack:%@", crashTime, name, reason, stackArray];
//把错误信息保存到本地文件,设置errorLogPath路径下
//并且经试验,此方法写入本地文件有效。
NSString *errorLogPath = [NSString stringWithFormat:@"%@/Documents/error.log", NSHomeDirectory()];
NSError *error =
BOOL isSuccess = [exceptionInfo writeToFile:errorLogPath atomically:YES encoding:NSUTF8StringEncoding error:nil];
if (!isSuccess) {
DLog(@"将crash信息保存到本地失败: %@", error.userInfo);
完成了CatchCrash类,接下来,AppDelegate.h里 #import "CatchCrash.h"在didFinishLaunchingWithOptions中添加如下代码:
//注册消息处理函数的处理方法
//如此一来,程序崩溃时会自动进入CatchCrash.m的uncaughtExceptionHandler()方法
NSSetUncaughtExceptionHandler(&uncaughtExceptionHandler);
最后一步:
在didFinishLaunchingWithOptions中,判断crash文件的写入路径errorLogPath下是否存在crash文件,若存在,说明上一次app有crash,则将该crash信息写入CocoaLumberJack的Log文件夹下,然后删掉errorLogPath下的crash文件,再上传Log到服务器
//若crash文件存在,则写入log并上传,然后删掉crash文件
NSFileManager *fileManager = [NSFileManager defaultManager];
NSString *errorLogPath = [NSString stringWithFormat:@"%@/Documents/error.log", NSHomeDirectory()];
if ([fileManager fileExistsAtPath:errorLogPath]) {
//用CocoaLumberJack库的fileLogger.logFileManager自带的方法创建一个新的Log文件,这样才能获取到对应文件夹下排序的Log文件
[fileLogger.logFileManager createNewLogFile];
//此处必须用firstObject而不能用lastObject,因为是按照日期逆序排列的,即最新的Log文件排在前面
NSString *newLogFilePath = [fileLogger.logFileManager sortedLogFilePaths].firstO
NSError *error =
NSString *errorLogContent = [NSString stringWithContentsOfFile:errorLogPath encoding:NSUTF8StringEncoding error:nil];
BOOL isSuccess = [errorLogContent writeToFile:newLogFilePath atomically:YES encoding:NSUTF8StringEncoding error:&error];
if (!isSuccess) {
DLog(@"crash文件写入log失败: %@", error.userInfo);
DLog(@"crash文件写入log成功");
NSError *error =
BOOL isSuccess = [fileManager removeItemAtPath:errorLogPath error:&error];
if (!isSuccess) {
DLog(@"删除本地的crash文件失败: %@", error.userInfo);
//上传最近的3个log文件,
//至少要3个,因为最后一个是crash的记录信息,另外2个是防止其中后一个文件只写了几行代码而不够分析
NSArray *logFilePaths = [fileLogger.logFileManager sortedLogFilePaths];
NSUInteger logCounts = logFilePaths.
if (logCounts &= 3) {
for (NSUInteger i = 0; i & 3; i++) {
NSString *logFilePath = logFilePaths[i];
//上传服务器
for (NSUInteger i = 0; i & logC i++) {
NSString *logFilePath = logFilePaths[i];
//上传服务器
可以通过控制打印文件路径,复制,在finder中通过command+shift+g键快速搜索,粘贴路径,来查看检测Log文件是否写入成功。
至此,我的Log日志上传服务器就基本完成了。水平有限,不当之处欢迎指导指正。
我试了下,若在CatchCrash.m的uncaughtExceptionHandler()方法中直接将错误信息打印到CocoaLumberJack的Log文件夹下却无法实现,程序每次一执行到createNewLogFile方法时就跳出了uncaughtExceptionHandler()函数,以至于没执行后面的writeToFile(),具体原因还不知。。。错误方法的代码如下:
//获取到AppDelegate中注册的fileLogger
DDFileLogger *fileLogger = DDLog.allLoggers.firstO
//程序崩溃时,把系统捕获到的错误信息写入本地文件
[fileLogger.logFileManager createNewLogFile];
NSString *newLogFilePath = [fileLogger.logFileManager sortedLogFilePaths].firstO
[exceptionInfo writeToFile:newLogFilePath atomically:YES encoding:NSUTF8StringEncoding error:nil];
参考文章:
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
打开微信“扫一扫”,打开网页后点击屏幕右上角分享按钮
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
选择支付方式:XMPPFramework 框架地址
  2.下载XMPPFramework框架:
  3.git clone
二.导入相关框架
CocoaLumberjack:日志框架
CocoaAsyncSocket:底层网络框架,实现异步Socket网络通讯(需要添加CFNetwork&Security框架依赖)
Kiss:XML解析框架(需要添加libxml2.dylib框架依赖,需要指定如下编译选项:
            Other Linker Flags = -lxml2
            Header Search Paths = /usr/include/libxml2)
将文件夹(Authentication,Categories,Core,Utilities)导入到项目
添加libresolv.dylib依赖
导入XMPP扩展框架:Extensions
将Sample_XMPPFramework.h添加到项目,并且重命名为XMPPFramework.h
三.问题处理:
  如果将项目移动到其他文件夹,可能会出现编译时无法找到libidn.a库的提示,按照以下步骤,可以解决此问题: 1. 在导航区域选中项目,然后在右侧选择Targets-项目-Build Phases 2. 在Link Binary With Libraries中,重新添加libidn.a库
优质网站模板}

我要回帖

更多关于 cocoalumberjack使用 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信