iOS调试技巧之Log
欢迎加QQ群讨论:157672725
博客地址:http://catchzeng.leanote.com/
为什么我的程序比别人耗内存、bug多、体验差?这些其实多多少少跟调试有关。调试能帮我们快速定位bug位置、优化程序运行速度等等。调试的方法很多,本文主要讲一下Log调试。
默认的NSLog局限太多,下面让我们看看如何实现一个不一样的Log。
Log
在调试的过程中,我们常常使用NSLog来向控制台输出一些信息。但是,NSLog的局限较大:
- 无法log到文件
- 不支持分级log
- NSLog耗时,降低程序的运行效率
为了解决这个问题,早期工程我使用宏开关来做控制Log的输出:
#define __LOG__ 8
#if __LOG__&8
#define HHLogErr(fmt, ...) {NSLog((@"<Error> %s [Line %d] " fmt), __PRETTY_FUNCTION__, __LINE__, ##__VA_ARGS__);}
#else
#define HHLogErr(x, ...)
#endif
#if __LOG__&4
#define HHLogWarn(fmt, ...) {NSLog((@"<Warning> %s [Line %d] " fmt), __PRETTY_FUNCTION__, __LINE__, ##__VA_ARGS__);}
#else
#define HHLogWarn(x, ...)
#endif
#if __LOG__&2
#define HHLogInfo(fmt, ...) {NSLog((@"<Info> %s [Line %d] " fmt), __PRETTY_FUNCTION__, __LINE__, ##__VA_ARGS__);}
#else
#define HHLogInfo(x, ...)
#endif
#if __LOG__&1
#define HHLogVerbose(fmt, ...) {NSLog((@"<Verbose> %s [Line %d] " fmt), __PRETTY_FUNCTION__, __LINE__, ##__VA_ARGS__);}
#else
#define HHLogVerbose(x, ...)
#endif
这种方式虽然能解决一部分问题,但是仍然不完美。后面在github上找到了Cocoa LumberJack https://github.com/CocoaLumberjack/CocoaLumberjack ,它能帮我们解决NSlog的局限问题。
效果:
实现:
1.pod安装CocoaLumberjack
pod 'CocoaLumberjack'
2.新建一个类定义LOG_LEVEL_DEF 宏,并把该类.h文件添加到pch文件中
@interface HHProfile : NSObject
#define LOG_LEVEL_DEF DDLogLevelAll
//注意:LOG_LEVEL_DEF不能改变,因为该宏在框架中需要使用[ DDLogLevelOff DDLogLevelError DDLogLevelWarning DDLogLevelInfo DDLogLevelDebug DDLogLevelVerbose DDLogLevelAll ]
@end
#ifndef PrefixHeader_pch
#define PrefixHeader_pch
#import <UIKit/UIKit.h>
#import <Foundation/Foundation.h>
#import "HHProfile.h"
#import "CocoaLumberjack.h"
#endif
3.配置log
// Add File Log
DDFileLogger* fileLogger = [[DDFileLogger alloc] init];
fileLogger.rollingFrequency = 60 * 60 * 24; // 24 hour rolling
fileLogger.logFileManager.maximumNumberOfLogFiles = 7;
[DDLog addLogger:fileLogger];
// Add Apple System Log
[DDLog addLogger:[DDASLLogger sharedInstance]];
// Enable XcodeColors
setenv("XcodeColors", "YES", 0);
// Add Standard lumberjack initialization
[DDLog addLogger:[DDTTYLogger sharedInstance]];
// And then enable colors
[[DDTTYLogger sharedInstance] setColorsEnabled:YES];
// Set colors for levels
[[DDTTYLogger sharedInstance] setForegroundColor:[UIColor blueColor] backgroundColor:nil forFlag:DDLogFlagInfo];
[[DDTTYLogger sharedInstance] setForegroundColor:[UIColor greenColor] backgroundColor:nil forFlag:DDLogFlagDebug];
[[DDTTYLogger sharedInstance] setForegroundColor:[UIColor lightGrayColor] backgroundColor:nil forFlag:DDLogFlagVerbose];
// Set format
HHLogFormatter* logFormatter = [[HHLogFormatter alloc]init];
[fileLogger setLogFormatter:logFormatter];
[[DDASLLogger sharedInstance] setLogFormatter:logFormatter];
[[DDTTYLogger sharedInstance] setLogFormatter:logFormatter];
其中HHLogFormatter是我自定义的一个输出格式。它能输出日期、文件名、出错行数、出错信息、出错方法名等,更加方便调试。
4.其中log的分级分颜色显示是我最喜欢CocoaLumberjack的地方。实现颜色的不同显示需要安装插件Alcatraz(Alcatraz安装见http://blog.youkuaiyun.com/catch01/article/details/46275293),并搜索XcodeColors安装(安装完毕需重启Xcode生效),如下图。