CocoaLumberjack(DDLog)分文件存儲日誌

需求:日誌根據不同的模塊存儲。
參考資料:https://medium.com/@jongwonwoo/logging-to-multiple-files-d1305d83223c#.nheqx8hfn
思路:利用DDContextWhitelistFilterLogFormatter設置白名單(自定義的level),存儲文件
代碼

#define ULHTTPLog(frmt, ...) LOG_MAYBE(YES, ddLogLevel, LOG_FLAG_DEBUG, UL_LOG_HTTP_LEVEL, __PRETTY_FUNCTION__, frmt, ## __VA_ARGS__)
   NSArray *paths = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES);
        NSString *baseDir = ([paths count] > 0) ? [paths objectAtIndex:0] : nil;
        NSString *logsDirectory = [baseDir stringByAppendingPathComponent:@"Logs"];
        DDLogFileManagerDefault *fileManagerTwo = [[DDLogFileManagerDefault alloc] initWithLogsDirectory:[logsDirectory stringByAppendingPathComponent:@"HTTP_TIME"]];
        otherLogger = [[DDFileLogger alloc] initWithLogFileManager:fileManagerTwo];
        DDContextWhitelistFilterLogFormatter *formatterOne = [[DDContextWhitelistFilterLogFormatter alloc] init];
        [formatterOne addToWhitelist:UL_LOG_HTTP_LEVEL];
        [otherLogger setLogFormatter:formatterOne];

        [DDLog addLogger:otherLogger];
#define UL_LOG_HTTP_LEVEL (1 << 10)

這樣ULHTTPLog輸出日誌就可以分文件存儲了。自定義文件名稱

DDLogFileManagerDefault
/**
 * Generates log file name with default format `"<bundle identifier> <date> <time>.log"`
 * Example: `MobileSafari 2013-12-03 17-14.log`
 *
 * You can change it by overriding `newLogFileName` and `isLogFile:` methods.
 **/
@property (readonly, copy) NSString *newLogFileName;

重寫newLogFileName就可以了。

==============================
以上內容是草稿,之前寫的,大概思路呈現,最近項目中細化了以下分日誌的操作。細節性的討論以下。
主要內容爲以下幾點
1. 自定義輸出的標籤和level(分文件用)
2. 自定義DDLogFileManagerDefault,重寫文件存儲文件的路徑和名稱。
自定義level
#define UL_LOG_HTTP_LEVEL (1 << 10)
自定義標籤
#define ULHttpLog(frmt, ...) LOG_MAYBE(YES, ddLogLevel, LOG_FLAG_DEBUG, UL_LOG_HTTP_LEVEL, __PRETTY_FUNCTION__, frmt, ## __VA_ARGS__)
使用ULHttpLog輸出日誌。

自定義DDLogFileManagerDefault
ULDDLogFileManagerDefault繼承於DDLogFileManagerDefault

#import "ULDDLogFileManagerDefault.h"

@interface ULDDLogFileManagerDefault ()

@property (nonatomic, copy) NSString *fileName;

@end

@implementation ULDDLogFileManagerDefault

#pragma mark - Lifecycle method

- (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];
}

- (BOOL)isLogFile:(NSString *)fileName {
    //返回YES爲每次重新創建文件,如果每次需要重新創建就直接返回NO,如果有別的創建需要直接重寫此方法
    return YES;
}

- (NSDateFormatter *)logFileDateFormatter {
    NSMutableDictionary *dictionary = [[NSThread currentThread]
                                       threadDictionary];
    NSString *dateFormat = @"yyyy'-'MM'-'dd' 'HH'-'mm'";
    NSString *key = [NSString stringWithFormat:@"logFileDateFormatter.%@", dateFormat];
    NSDateFormatter *dateFormatter = dictionary[key];

    if (dateFormatter == nil) {
        dateFormatter = [[NSDateFormatter alloc] init];
        [dateFormatter setLocale:[NSLocale localeWithLocaleIdentifier:@"en_US_POSIX"]];
        [dateFormatter setDateFormat:dateFormat];
        [dateFormatter setTimeZone:[NSTimeZone timeZoneForSecondsFromGMT:0]];
        dictionary[key] = dateFormatter;
    }

    return dateFormatter;
}

@end

初始化邏輯

+ (DDFileLogger *)setupLoadOtherLogDir:(NSString *)logDir fileName:(NSString *)fileName logLevel:(NSUInteger)logLevel {
    ULDDLogFileManagerDefault *ulFileManager = [[ULDDLogFileManagerDefault alloc] initWithLogsDirectory:logDir fileName:fileName];
    DDFileLogger *fileLogger = [[DDFileLogger alloc] initWithLogFileManager:ulFileManager];
    fileLogger.maximumFileSize = 10 * 1024 * 1024;           // 文件達到 10MB 回滾
    fileLogger.rollingFrequency = 0;                        // 忽略時間回滾
    fileLogger.logFileManager.maximumNumberOfLogFiles = 5;  // 最多 5 個日誌文件
    ULDDContextWhitelistFilterLogFormatter *logFormatter = [[ULDDContextWhitelistFilterLogFormatter alloc] init];
    [logFormatter addToWhitelist:logLevel];
    [fileLogger setLogFormatter:logFormatter];
    [DDLog addLogger:fileLogger];
    return fileLogger;
}

調用實例

DDFileLogger *logInfoLogger = [self setupLoadOtherLogDir:[[self logDirectory] stringByAppendingPathComponent:@"LogInfoDir"] fileName:@"LogInfoFileName" logLevel:UL_LOG_INFO_LEVEL];

//如果要操作日誌對logInfoLogger進行任何操作
//UL_LOG_INFO_LEVEL 至關重要,根據此level分文件,我嘗試進行或操作,不生效,logFormatter有個addToWhitelist,直接添加多個就ok,就能實現組合操作了。
//ULDDContextWhitelistFilterLogFormatter *logFormat = logInfoLogger.logFormatter;
//[logFormat addToWhitelist:UL_LOG_OTHER_LEVEL];
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章