Подтвердить что ты не робот

NSLog() для консоли и файла

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

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

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

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

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

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

Кто-нибудь знает, как управлять этой работой? Thanx заранее.

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

4b9b3361

Ответ 1

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

Вам нужна как минимум функция, которая принимает переменные аргументы и printd для 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
}

Или существуют фреймворки Cocoa.

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

Ответ 2

Мы реализовали способ:

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

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