iPhone:一旦我将NSLog重定向到文件,如何将其恢复到控制台?

8

我正在使用:

#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 / stderr重定向回控制台?

谢谢!

2个回答

16

这段内容来自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
这并没有明确回答你的问题,但如果你只需要重定向NSLog的输出,那么我建议使用一个NSLog()包装器,并在其中根据用户可控制的标志决定是否发送到文件或常规NSLog/stderr。

(对我来说,这似乎是一个令人惊讶的设计,基本上重新定向stderr流以实现这一点 - 如果您在NSLog级别上方使用包装器,您也可以选择将输出发送到两个位置,如果您曾经需要的话。)


同意!不要随意重定向 stderr! - Adam Woś
1
有合理的理由将所有的NSLog调用重定向到一个文件中,例如如果您需要捕获由第三方库生成的日志,这些库在内部使用NSLog。 - irodrigo17

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接