簡介
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