/ iOS 开发

使用 CocoaLumberjack 打造 Log 系统

CocoaLumberjack 是一款非常好用的 Log 输出工具,可以自定义工程中的日志信息输出方式,可用于 Mac 和 iOS 项目开发中,有 Objective-C 和 swift 版本,在 github 已有6000+的 star。Github传送门

使用 NSLog 的弊端

在未接触 CocoaLumberjack 之前,我一般使用 NSLog 来输出日志到控制台,这样做虽然简单,但也带来很多问题:

  • 使用 NSLog 会将日志信息输出到Console,使用Xcode连接设备在 Device->Console 中可以看到所有的 Log 信息,甚至普通用户使用 iTools 之类的工具也能在看到这些信息,如果日志信息中包含应用的关键信息,则会造成泄露;
  • 程序中大量使用 NSLog 并且在发布时未将其屏蔽会影响程序性能,尤其是游戏类应用会造成帧数下降;
  • NSLog 的日志输出方式有限,不利于打造一个成熟的 Log 系统。

CocoaLumberjack 的优点

CocoaLumberjack 的出现,解决了 NSLog 的很多问题,其简单,快捷,强大。

  • CocoaLumberjack 支持日志分级(Verbose、Debug、Info、Warn、Error),配合 XcodeColors 插件可以让不同等级的日志显示出不同的颜色,方便我们对日志信息作出区分;

  • CocoaLumberjack 可以将 Log 输出到Console.app、Xcode控制台、文件系统和数据库,可以很方便的打造自己的 Log 系统;

  • CocoaLumberjack 可以很方便的控制 Log 的开启与关闭。

开始使用 CocoaLumberjack 吧!

CocoaLumberjack 支持 Cocoapod 和 Carthage,集成很easy!
以 Objective-C 为例,集成好之后需要导入头文件 #import <CocoaLumberjack/CocoaLumberjack.h> 需要设置

[DDLog addLogger:[DDASLLogger sharedInstance]];
[DDLog addLogger:[DDTTYLogger sharedInstance]];

以及定义输入日志等级

 #if DEBUG
 static const DDLogLevel ddLogLevel = DDLogLevelAll;
 #else
 static const DDLogLevel ddLogLevel = DDLogLevelWarning;
 #endif

配合 XcodeColors 使用

首先需要在 Xcode > Alcatraz 中安装插件 XcodeColors,也可以手动安装。
添加以下代码启用颜色

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

如果颜色未生效,可以在 Edit Scheme-> Run –> Arguments(Environment Variabl)环境变量,添加一个叫做XcodeColors的键,并将其值设为YES。
效果如下:
![2016-02-26 at 下午5.56](https://oj44a8qm0.qnssl.com/2016-02-26-2016-02-26 at 下午5.56.png)

自定义日志格式

CocoaLumberjack 支持自定义输出日志格式,可以创建一个类通过实现DDLogFormatter协议的方法

- (NSString *)formatLogMessage:(DDLogMessage *)logMessage;

来实现:

- (NSString *)formatLogMessage:(DDLogMessage *)logMessage {
    NSString *logLevel;
    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;
    }
    return
    [NSString stringWithFormat:@"%@ | %@\n", logLevel, logMessage->_message];
}

效果如下:
![2016-02-26 at 下午5.29](https://oj44a8qm0.qnssl.com/2016-02-26-2016-02-26 at 下午5.29.png)

好了,今天就先研究到这里,后面再研究下如何把日志输出到文件和数据库,然后定期发送到服务器。