基於第三方CocoaLumberjack(DDLog)做儲存不同分類的日誌

KoonChaoSo發表於2018-06-11

簡介

  CocoaLumberjack(以下簡稱:DDLog)是一個可以在iOS和Mac開發中使用的日誌庫,強大又不失靈活。整合進專案後,配置下,然後用DDLog語句簡單地取代NSLog語句( DDLog的使用方法和NSLog一樣)。
而且DDLog擁有基本的DDTTYLogger輸出控制檯、DDASLLogger輸出到Console.app、DDFileLogger輸出到檔案、實現DDAbstractDatabaseLogger儲存到資料庫。

基於第三方CocoaLumberjack(DDLog)做儲存不同分類的日誌

問題

  當時公司有個需求,就是把不同的日誌上傳到後臺,並且需要分類上傳。這時候我發現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

相關文章