需求:日志根据不同的模块存储。
参考资料: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];