CocoaLumberjack(DDLog)分文件存储日志

2 篇文章 0 订阅

需求:日志根据不同的模块存储。
参考资料: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];
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值