iPhone: как только я перенаправил NSLog в файл, как мне вернуть его на консоль? - PullRequest
7 голосов
/ 20 января 2010

Я использую:

#if TARGET_IPHONE_SIMULATOR == 0
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *documentsDirectory = [paths objectAtIndex:0];
    NSString *logPath = [documentsDirectory stringByAppendingPathComponent:@"console.log"];
    freopen([logPath cStringUsingEncoding:NSASCIIStringEncoding],"a+",stderr);
#endif

.. чтобы перенаправить NSLog в файл, который, кстати, прекрасно работает.

Я хочу сделать запись в файл, что-то, что пользователь моего приложения может включать и выключать ... так кто-нибудь знает, как мне перенаправить NSLog / stderr обратно на консоль?

Спасибо!

Ответы [ 2 ]

15 голосов
/ 13 мая 2010

Это взято из http://www.atomicbird.com/blog/2007/07/code-quickie-redirect-nslog

// Save stderr so it can be restored.
int stderrSave = dup(STDERR_FILENO);

// Send stderr to our file
FILE *newStderr = freopen("/tmp/redirect.log", "a", stderr);

NSLog(@"This goes to the file");

// Flush before restoring stderr
fflush(stderr);

// Now restore stderr, so new output goes to console.
dup2(stderrSave, STDERR_FILENO);
close(stderrSave);

// This NSLog will go to the console.
NSLog(@"This goes to the console");
4 голосов
/ 20 января 2010

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

(Мне кажется удивительным замысел для фундаментального перенаправления потока stderr для достижения этой цели - и с оболочкой выше уровня NSLog, вы могли бы так же легко выбрать отправку вывода в оба места, если вы когда-либо захотели. )

...