CocoaLumberjack(DDLog)分文件存储日志

    xiaoxiao2021-08-26  73

    需求:日志根据不同的模块存储。 参考资料: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];
    转载请注明原文地址: https://ju.6miu.com/read-677194.html

    最新回复(0)