NSLog () как в консоль, так и в файл

Я хотел бы перенаправить NSog() в файл, но по-прежнему видеть вывод в консоли. Я знаю, что stderr можно перенаправить в файл с помощью:

freopen("file.log", "a+", stderr);

но после перенаправления в файл журнал больше не отображается в выводе консоли.

Я мог бы создать собственную оболочку вокруг NSLog(), но я не получал бы журналов сбоев, которые записываются в stderr в момент сбоя приложения.

Я также экспериментировал с dup() и другими методами для дублирования файловых дескрипторов, но результат был эфирным в файле или в консоли, а не в обоих.

Здесь задавались аналогичные вопросы: Запишите stderr на iPhone как в файл, так и в console, но без принятого ответа или с предложением использовать оболочку NSLog ().

Есть у кого-нибудь идеи, как управлять этой работой? Спасибо заранее.

ОБНОВЛЕНИЕ: наиболее важной частью перенаправления является запись журналов системных ошибок (stderr) как в консоль, так и в файл.


person Miroslav Kovac    schedule 08.03.2012    source источник
comment
Что, если вы ведете два отдельных журнала, отправляете один в файл и один на консоль, но сохраняете их одинаковыми?   -  person JTApps    schedule 08.03.2012
comment
Как вы предлагаете с этим справиться? Самое главное, чтобы журналы системных ошибок записывались как в консоль, так и в файл.   -  person Miroslav Kovac    schedule 08.03.2012
comment
NSLog по умолчанию журналы выводятся на консоль, может быть, вы могли бы просто извлечь оттуда журналы stackoverflow.com/questions/7150849/   -  person Joe    schedule 08.03.2012
comment
Извините, я не понял, что вы делаете это для журналов ошибок, я бегло просмотрел и предположил, что это просто использование NSLog   -  person JTApps    schedule 08.03.2012


Ответы (2)


Согласно документации, вам понадобится настраиваемое средство ведения журнала.

Вам понадобится как минимум функция, которая принимает вариативные аргументы и выводит их в NSLog и fprintf, например:

void myLog(NSString* format, ...)
{
    va_list argList;
    va_start(argList, format);
    NSString* formattedMessage = [[NSString alloc] initWithFormat: format arguments: argList];
    va_end(argList);
    NSLog(@"%@", formattedMessage);
    fprintf(myFileDescriptor, "%s\n", [formattedMessage UTF8String]);
    [formattedMessage release]; // if not on ARC
}

Или есть фреймворки для ведения журналов Какао.

Поиск конкретной структуры ведения журнала какао

person JeremyP    schedule 08.03.2012
comment
Спасибо, это хорошо, но проверьте мой обновленный вопрос. Я ищу способ получить системные журналы stderr как для консоли, так и в файл, а не только для моих пользовательских журналов. Спасибо. - person Miroslav Kovac; 08.03.2012
comment
@Miroslav: Я не думаю, что это возможно без изменений, аналогичных тому, что я вам дал. - person JeremyP; 09.03.2012

Мы реализовали следующее:

if (!isatty(STDERR_FILENO)) {
    // Redirection code
}

Это основано на общем предположении, что если консоль подключена, вам не нужно хранить эти журналы в файле, поскольку вы уже выполняете отладку. Таким образом, всякий раз, когда консоль подключается, журналы будут печататься там, в противном случае сохраняться в файл.

person Sailesh    schedule 08.03.2012