NSLog() для консоли и файла
Я хотел бы перенаправить NSog()
в файл, но все же посмотреть вывод в консоли.
Я знаю, что stderr
можно перенаправить в файл, используя:
freopen("file.log", "a+", stderr);
но после перенаправления его на файл журнал больше не отображается на выходе консоли.
Я мог бы создать пользовательскую оболочку вокруг NSLog()
, но я бы не стал регистрировать журналы сбоев, которые записываются в stderr
в момент сбоя приложения.
Я также экспериментировал с dup()
и другими методами дублирования файловых дескрипторов, но выход был эфир в файле или на консоли, никогда в обоих.
Аналогичные вопросы задавали здесь:
Напишите stderr на iPhone как для файла, так и для консоли
но без принятого ответа или с предложением использовать обертку NSLog().
Кто-нибудь знает, как управлять этой работой?
Thanx заранее.
UPDATE:. Наиболее важной частью перенаправления является наличие журналов системных ошибок (stderr), написанных на консоль и файл.
Ответы
Ответ 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
}
Это основано на общем предположении, что если консоль подключена, вам не нужно сохранять эти журналы в файле, поскольку вы уже отлаживаете. Поэтому всякий раз, когда консоль подключена, журналы будут там распечатаны, в противном случае сохранены в файл.