Создание нескольких файлов журнала в приложении iPhone - PullRequest
3 голосов
/ 21 августа 2011

Я хочу создать два файла журнала в своем приложении для iPhone. Если я перенаправлю вывод NSLog в файл с помощью freopen (), то все операторы журнала будут помещены в один из упомянутых файлов.
Но я хочу поместить некоторые операторы журнала в один файл, а некоторые в другой файл.

Есть идеи, как я могу это сделать?

Ответы [ 2 ]

14 голосов
/ 14 октября 2011

Начните с фреймворка Lumberjack: https://github.com/robbiehanson/CocoaLumberjack

Я хочу поместить некоторые операторы журнала в один файл, а некоторые в другой файл

Есть несколько способовдля достижения этой цели.Вот один пример: Добавьте 2 файловых регистратора:

fileLoggerA = [[DDFileLogger alloc] init];
fileLoggerB = [[DDFileLogger alloc] init];

[DDLog addLogger:fileLoggerA];
[DDLog addLogger:fileLoggerB];

Таким образом, на этом этапе все операторы журнала будут направлены как на fileLogger1, так и на fileLogger2.Далее мы собираемся добавить «фильтр» к каждому fileLogger, чтобы они игнорировали операторы журнала, не направленные на них.

Мы сделаем это, создав 2 различных макроса журналирования: ALog () & BLog ()

fileLoggerA будет записывать только лог-операторы из ALog ().fileLoggerB будет записывать только лог-операторы из BLog ().

Чтобы настроить это, мы можем воспользоваться «контекстом журналирования».Вы можете сделать что-то простое, например:

#define ALog(frmt, ...) SYNC_LOG_OBJC_MACRO(0, 0, 1, frmt, ##__VA_ARGS__)
#define BLog(frmt, ...) SYNC_LOG_OBJC_MACRO(0, 0, 2, frmt, ##__VA_ARGS__)

Очевидно, что вы можете продвинуться дальше, чем это (например, добавить поддержку уровней журнала и т. Д.). Но стоит отметить, что у ALog «контекст» равен 1и BLog имеет «контекст», равный 2.

Теперь вам просто нужно создать «пользовательский форматтер / фильтр».Вот пример:

- (NSString *)formatLogMessage:(DDLogMessage *)logMessage
{
    if (logMessage->logContext == theContextIShouldLog)
        return logMessage->logMsg;
    else
        return nil;
}

И, конечно, добавьте свой собственный форматер / фильтр для файловых регистраторов:

[fileLoggerA setLogFormatter:[MyContextFilter filterWith:1]];
[fileLoggerB setLogFormatter:[MyContextFilter filterWith:2]];

Более подробную информацию по этим темам можно найти в проекте Lumberjack.страницы:

https://github.com/robbiehanson/CocoaLumberjack/wiki/GettingStarted https://github.com/robbiehanson/CocoaLumberjack/wiki/CustomFormatters https://github.com/robbiehanson/CocoaLumberjack/wiki/CustomContext https://github.com/robbiehanson/CocoaLumberjack/wiki/CustomLogLevels

2 голосов
/ 21 августа 2011

Лучшим подходом было бы написать собственный класс логгера как замену, которую вы используете вместо NSLog (). Таким образом, вы можете легко определить во время выполнения, какие журналы должны быть записаны в какой файл. Ваш пользовательский класс может использовать NLog () для одновременной записи в консоль. Это кажется оптимальным подходом, поскольку freopen() просто массово перенаправляет весь вывод журнала.

...