CocoaLumberjack FileLogger ведет журнал в несколько файлов

Я использую эту структуру CocoaLumberjack для регистрации всех своих сообщений в дизайне Objective-C. Теперь я хочу записывать все ошибки в один файл, а все остальные сообщения в другой файл. Я знаю, что могу использовать средство форматирования для фильтрации этой информации. Я создал два экземпляра DDFileLogger в AppDelegate, но эти два регистратора продолжают записывать в один и тот же файл. Интересно, есть ли способ указать место назначения ведения журнала, чтобы два регистратора записывали в два разных файла.


person juniorb    schedule 16.10.2012    source источник
comment
У меня такая же проблема. Попробовал подход, описанный в этом сообщении, но он не работает ни на устройстве, ни на симуляторе. Нашли рабочий подход?   -  person thegrinner    schedule 08.11.2012
comment
Можем ли мы получить документацию или ссылку, где я могу получить пошаговую инструкцию по интеграции Cocoalumberjack с Hockey в проект SWIFT 2.2. Все ссылки и веб-сайт хоккейных приложений показывают всю реализацию в Objective-C. Спасибо!   -  person Tejas    schedule 10.01.2017


Ответы (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__)

Это то, что сработало для меня.

person KabukiAdam    schedule 08.01.2013
comment
Вы также можете упростить это, используя контекст по умолчанию 0 и добавив код loggerOne. Затем вам нужно только добавить DDContextWhitelistFilterLogFormatter для контекста 0 в ваш файловый регистратор по умолчанию. - person dbainbridge; 04.02.2014
comment
Неявное объявление SYNC_LOG_OBJC_MACRO не допускается в c99. Кто-нибудь может помочь по этому поводу?? - person Maneesh Sharma; 11.10.2017

Вы можете добиться чего-то очень близкого, используя новую функцию (разный уровень ведения журнала для каждого регистратора). См. https://github.com/robbiehanson/CocoaLumberjack/wiki/PerLoggerLogLevels. Создание двух файловых регистраторов (один с уровнем ошибок, а другой с подробным описанием) будет не совсем таким, как вы описали, поскольку журналы ошибок будут попадать в оба файла. Достаточно ли этого?

person Bogdan    schedule 21.11.2013
comment
Мне это тоже нужно, но главное, чтобы ведение журнала происходило в отдельных файлах. Так что то, что он входит в оба файла, по крайней мере, противоречит моей цели. - person dbainbridge; 03.02.2014