基于第三方CocoaLumberjack(DDLog)做保存不同分类的日志

简介

  CocoaLumberjack(以下简称:DDLog)是一个可以在iOS和Mac开发中使用的日志库,强大又不失灵活。集成进项目后,配置下,然后用DDLog语句简单地取代NSLog语句( DDLog的使用方法和NSLog一样)。
而且DDLog拥有基本的DDTTYLogger输出控制台、DDASLLogger输出到Console.app、DDFileLogger输出到文件、实现DDAbstractDatabaseLogger保存到数据库。

问题

  当时公司有个需求,就是把不同的日志上传到后台,并且需要分类上传。这时候我发现DDLog是可以自定义日志和自定义路径。然后就写了一个根据不同flag来分别保存不同路径的日志模块Demo来使用。

上一段关键代码例子:

CSFileLogger.h

@interface CSFileLogger : DDFileLogger
@property (nonatomic, assign) NSUInteger flag;
- (instancetype)initWithFlag:(NSUInteger)flag;
@end

@interface CSFileManagerDefault : DDLogFileManagerDefault
- (instancetype)initWithLogsDirectory:(NSString *)logsDirectory
                             fileName:(NSString *)name;
@end

复制代码

CSFileLogger.m

@implementation CSFileLogger
- (NSString *)loggerName
{
    return [NSString stringWithFormat:@"cs.ddlog.fileLogger"];
}

- (instancetype)initWithFlag:(NSUInteger)flag{    
    //新建一个文件夹去保存
    _flag = flag;
    NSString *logsDirectory = [NSHomeDirectory() stringByAppendingPathComponent:[NSString stringWithFormat:@"Library/Caches/%ld",(long)flag]];
    CSFileManagerDefault *defaultLogFileManager = [[CSFileManagerDefault alloc] initWithLogsDirectory:logsDirectory fileName:@"cslogger"];
    return [self initWithLogFileManager:defaultLogFileManager];
}
@end

@interface CSFileManagerDefault()
@property (nonatomic, strong) NSString *fileName;
@end
@implementation CSFileManagerDefault

- (instancetype)initWithLogsDirectory:(NSString *)logsDirectory
                             fileName:(NSString *)name {
    //logsDirectory日志自定义路径
    self = [super initWithLogsDirectory:logsDirectory];
    if (self) {
        self.fileName = name;
    }
    return self;
}

#pragma mark - Override methods
- (NSString *)newLogFileName {
    //重写文件名称
    NSDateFormatter *dateFormatter = [self logFileDateFormatter];
    NSString *formattedDate = [dateFormatter stringFromDate:[NSDate date]];
    return [NSString stringWithFormat:@"%@-%@.log", self.fileName, formattedDate];
}

- (NSDateFormatter *)logFileDateFormatter {
    
    //获取当前线程的字典
    NSMutableDictionary *dictionary = [[NSThread currentThread]
                                       threadDictionary];
    //设置日期格式
    NSString *dateFormat = @"yyyy'-'MM'-'dd'";
    NSString *key = [NSString stringWithFormat:@"logFileDateFormatter.%@", dateFormat];
    NSDateFormatter *dateFormatter = dictionary[key];
    
    if (dateFormatter == nil) {
        //设置日期格式
        dateFormatter = [[NSDateFormatter alloc] init];
        [dateFormatter setLocale:[NSLocale localeWithLocaleIdentifier:@"zh_CN"]];
        [dateFormatter setDateFormat:dateFormat];
        [dateFormatter setTimeZone:[NSTimeZone timeZoneForSecondsFromGMT:0]];
        dictionary[key] = dateFormatter;
    }
    
    return dateFormatter;
}

@end
复制代码

最后将自定义的Logger加到DDLog里面做保存文件

+ (id<DDLogger>)createCSFileLogger:(NSInteger)flag
{
    //添加DDLog 允许自定义的log类型白名单
    CSContextWhitelistFilterLogFormatter *contextFilter = [[CSContextWhitelistFilterLogFormatter alloc] init];
    [contextFilter addToWhitelist:flag];
    CSFileLogger *customLogger = [[CSFileLogger alloc] initWithFlag:flag];
    [customLogger setLogFormatter:contextFilter];
    customLogger.rollingFrequency = 60 * 60 * 24; // 24 hour rolling
    customLogger.logFileManager.maximumNumberOfLogFiles = 10;
    return customLogger;
}

[DDLog addLogger:[CSLoggerAssembler createCSFileLogger:1000]];
[DDLog addLogger:[CSLoggerAssembler createCSFileLogger:1001]];
复制代码

   这样就会根据外面注册的flag来分别保存到"Library/Caches/1000/"和"Library/Caches/1001/"的文件路径之下了。
  好简单地就做好了一个demo了。希望大家可以有用吧。
Demo链接: https://github.com/KoonChaoSo/CSLogger

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值