Я использую эту структуру CocoaLumberjack для регистрации всех своих сообщений в дизайне Objective-C. Теперь я хочу записывать все ошибки в один файл, а все остальные сообщения в другой файл. Я знаю, что могу использовать средство форматирования для фильтрации этой информации. Я создал два экземпляра DDFileLogger в AppDelegate, но эти два регистратора продолжают записывать в один и тот же файл. Интересно, есть ли способ указать место назначения ведения журнала, чтобы два регистратора записывали в два разных файла.
CocoaLumberjack FileLogger ведет журнал в несколько файлов
Ответы (2)
Ключом к тому, чтобы это работало, является настройка каждого DDFileLogger с собственным DDLogFileManager с отдельными путями к каталогам журналов для каждого. DDLogFileManager использует путь к каталогу журнала, чтобы определить, в какой файл вести журнал, поэтому, если два из них указывают на один и тот же каталог, они будут вести журнал в один и тот же файл журнала. Таким образом, ключ в том, чтобы использовать отдельные каталоги для каждого журнала.
Для двух разных типов журналов: «Один» и «Два»:
// Set the base log directory
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES);
NSString *baseDir = ([paths count] > 0) ? [paths objectAtIndex:0] : nil;
NSString *logsDirectory = [baseDir stringByAppendingPathComponent:@"Logs"];
// set up file logger One to log to subdirectory "One"
DDLogFileManagerDefault *fileManagerOne = [[DDLogFileManagerDefault alloc] initWithLogsDirectory:[logsDirectory stringByAppendingPathComponent:@"One"]];
DDFileLogger *loggerOne = [[DDFileLogger alloc] fileManagerOne];
// Use the filter formatter to make sure only "One" logs go to the "One" log files
ContextWhitelistFilterLogFormatter *formatterOne = [[ContextWhitelistFilterLogFormatter alloc] init];
[formatterOne addToWhitelist:LOG_CONTEXT_ONE];
[loggerOne formatterOne];
[DDLog loggerOne];
// set up file logger Two to log to subdirectory "Two"
DDLogFileManagerDefault *fileManagerTwo = [[DDLogFileManagerDefault alloc] initWithLogsDirectory:[logsDirectory stringByAppendingPathComponent:@"Two"]];
DDFileLogger *loggerTwo = [[DDFileLogger alloc] fileManagerTwo];
// Use the filter formatter to make sure only "Two" logs go to the "Two" log files
ContextWhitelistFilterLogFormatter *formatterTwo = [[ContextWhitelistFilterLogFormatter alloc] init];
[formatterTwo addToWhitelist:LOG_CONTEXT_TWO];
[loggerTwo formatterTwo];
[DDLog loggerTwo];
тогда, конечно, вам все равно нужно определить макросы для ведения журнала:
#define LOG_CONTEXT_ONE 1
#define LOG_CONTEXT_TWO 2
#define LogOne(frmt, ...) SYNC_LOG_OBJC_MACRO(0, 0, LOG_CONTEXT_ONE, frmt, ##__VA_ARGS__)
#define LogTwo(frmt, ...) SYNC_LOG_OBJC_MACRO(0, 0, LOG_CONTEXT_TWO, frmt, ##__VA_ARGS__)
Это то, что сработало для меня.
Вы можете добиться чего-то очень близкого, используя новую функцию (разный уровень ведения журнала для каждого регистратора). См. https://github.com/robbiehanson/CocoaLumberjack/wiki/PerLoggerLogLevels. Создание двух файловых регистраторов (один с уровнем ошибок, а другой с подробным описанием) будет не совсем таким, как вы описали, поскольку журналы ошибок будут попадать в оба файла. Достаточно ли этого?