(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", 0);
[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 = 60 * 60 * 24; // 24 hour rolling
        fileLogger.logFileManager.maximumNumberOfLogFiles = 7;

        _fileLogger = fileLogger;
    }
    return _fileLogger;
}

如果没有设置,它是有提供相应的默认值:

unsigned long long const kDDDefaultLogMaxFileSize      = 1024 * 1024;      // 1 MB  一个文件大小
NSTimeInterval     const kDDDefaultLogRollingFrequency = 60 * 60 * 24;     // 24 Hours  一天
NSUInteger         const kDDDefaultLogMaxNumLogFiles   = 5;                // 5 Files  五个
unsigned long long const kDDDefaultLogFilesDiskQuota   = 20 * 1024 * 1024; // 20 MB  总共

如果有存储路径(可以设置paths):

NSString *appName = [[NSProcessInfo processInfo] processName];
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSLibraryDirectory, NSUserDomainMask, YES);
NSString *basePath = ([paths count] > 0) ? paths[0] : 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", 0);
    [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 = 60 * 60 * 24; // 24 hour rolling
        fileLogger.logFileManager.maximumNumberOfLogFiles = 7;

        _fileLogger = fileLogger;
    }

    return _fileLogger;
}
@end

二:知识点

2.1 关于等级包含的设置,DDLogLevelAll显示所有,基它则依次降底跟相互包含;可以通过这个代码了解到枚举的设置;

typedef NS_OPTIONS(NSUInteger, DDLogFlag){
    /**
     *  0...00001 DDLogFlagError
     */
    DDLogFlagError      = (1 << 0),

    /**
     *  0...00010 DDLogFlagWarning
     */
    DDLogFlagWarning    = (1 << 1),

    /**
     *  0...00100 DDLogFlagInfo
     */
    DDLogFlagInfo       = (1 << 2),

    /**
     *  0...01000 DDLogFlagDebug
     */
    DDLogFlagDebug      = (1 << 3),

    /**
     *  0...10000 DDLogFlagVerbose
     */
    DDLogFlagVerbose    = (1 << 4)
};

/**
 *  Log levels are used to filter out logs. Used together with flags.
 */
typedef NS_ENUM(NSUInteger, DDLogLevel){
    /**
     *  No logs
     */
    DDLogLevelOff       = 0,

    /**
     *  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];
时间: 2025-01-17 23:49:52

(20160604)开源第三方学习之CocoaLumberjack的相关文章

(20160602)开源第三方学习之SDWebImage

这个类库提供一个UIImageView类别以支持加载来自网络的远程图片.具有缓存管理.异步下载.同一个URL下载次数控制和优化等特征. 地址:https://github.com/rs/SDWebImage 原理图: 各个类的交互图: 一 插件的运用 针对这部分的理论知识可以查看文章<SDWebImage 图片下载缓存框架 常用方法及原理>,已经针对SDWebImage的相关知识点都有相应介绍:并且把相关的类都有注解,接下来将会简单介绍一些属性及小知识点: 1.1 设置存储路径 可以在项目Ap

开源深度学习架构Caffe

Caffe 全称为 Convolutional Architecture for Fast Feature Embedding,是一个被广泛使用的开源深度学习框架(在 TensorFlow 出现之前一直是深度学习领域 GitHub star 最多的项目),目前由伯克利视觉学中心(Berkeley Vision and Learning Center,BVLC)进行维护.Caffe 的创始人是加州大学伯克利的 Ph.D.贾扬清,他同时也是TensorFlow的作者之一,曾工作于 MSRA.NEC

转:从开源项目学习 C 语言基本的编码规则

从开源项目学习 C 语言基本的编码规则 每个项目都有自己的风格指南:一组有关怎样为那个项目编码约定.一些经理选择基本的编码规则,另一些经理则更偏好非常高级的规则,对许多项目而言则没有特定的编码规则,项目中的每个开发者使用他自己的风格. 所有代码都保持一致风格的大型库,更容易让人理解. 有许多资源是关于能让人采取的更好的编码规则的,我们可以通过以下方式学到好的编码规则: 阅读书或杂志 浏览网站 与同事交流 参加培训 另一个更有趣的方法是通过研究一个成熟的知名开源项目来得知其开发者是怎样编写代码的.

十个值得一试的开源深度学习框架

IT168 评论本周早些时候Google开源了TensorFlow(GitHub),此举在深度学习领域影响巨大,因为Google在人工智能领域的研发成绩斐然,有着雄厚的人才储备,而且Google自己的Gmail和搜索引擎都在使用自行研发的深度学习工具. 1 无疑,来自Google军火库的TensorFlow必然是开源深度学习软件中的明星产品,登陆GitHub当天就成为最受关注的项目,当周获得评星数就轻松超过1万个. 对于希望在应用中整合深度学习功能的开发者来说,GitHub上其实还有很多不错的开

十个开源深度学习框架

来源:http://www.ctocio.com/ccnews/19687.html 本周早些时候Google开源了TensorFlow(GitHub),此举在深度学习领域影响巨大,因为Google在人工智能领域的研发成绩斐然,有着雄厚的人才储备,而且Google自己的Gmail和搜索引擎都在使用自行研发的深度学习工具. 无疑,来自Google军火库的TensorFlow必然是开源深度学习软件中的明星产品,登陆GitHub当天就成为最受关注的项目,当周获得评星数就轻松超过1万个. 对于希望在应用

GitHub 上 57 款最流行的开源深度学习项目

转载:https://www.oschina.net/news/79500/57-most-popular-deep-learning-project-at-github 本文整理了 GitHub 上最流行的 57 款深度学习项目(按 stars 排名).最后更新:2016.08.09 1.TensorFlow 使用数据流图计算可扩展机器学习问题 TensorFlow 是谷歌的第二代机器学习系统,按照谷歌所说,在某些基准测试中,TensorFlow 的表现比第一代的 DistBelief 快了2

推荐GitHub上10 个开源深度学习框架

推荐GitHub上10 个开源深度学习框架 日前,Google 开源了 TensorFlow(GitHub),此举在深度学习领域影响巨大,因为 Google 在人工智能领域的研发成绩斐然,有着雄厚的人才储备,而且 Google 自己的 Gmail 和搜索引擎都在使用自行研发的深度学习工具. 无疑,来自 Google 军火库的 TensorFlow 必然是开源深度学习软件中的明星产品,登陆 GitHub 当天就成为最受关注的项目,当周获得评星数就轻松超过 1 万个. 对于希望在应用中整合深度学习功

Computational Network Toolkit (CNTK) 是微软出品的开源深度学习工具包

用 CNTK 搞深度学习 (一) 入门 Computational Network Toolkit (CNTK) 是微软出品的开源深度学习工具包.本文介绍CNTK的基本内容,如何写CNTK的网络定义语言,以及跑通一个简单的例子. 根据微软开发者的描述,CNTK的性能比Caffe,Theano, TensoFlow等主流工具都要强.它支持CPU和GPU模式,所以没有GPU,或者神经网络比较小的实验,直接用CPU版的CNTK跑就行了. 其开源主页在 https://github.com/Micros

开源深度学习框架(楚才国科)

周早些时候Google开源了TensorFlow(GitHub),此举在深度学习领域影响巨大,因为Google在人工智能领域的研发成绩斐然,有着雄厚的人才储备,而且Google自己的Gmail和搜索引擎都在使用自行研发的深度学习工具. 无疑,来自Google军火库的TensorFlow必然是开源深度学习软件中的明星产品,登陆GitHub当天就成为最受关注的项目,当周获得评星数就轻松超过1万个. 对于希望在应用中整合深度学习功能的开发者来说,GitHub上其实还有很多不错的开源项目值得关注,首先我