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 重定向到一个文件,顺便说一下效果很好。

我想记录我的应用程序的用户可以打开和关闭的文件。所以有人知道我如何将 NSLog/stderr 重定向控制台吗?

谢谢!

4

2 回答 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");
于 2010-05-13T00:14:03.683 回答
4

这并没有明确回答您的问题,但是如果您需要重定向的只是 NSLog 的输出,那么我会考虑使用 NSLog() 周围的包装器,并根据一个标志决定是发送到文件还是发送到常规 NSLog/stderr您保持用户可以控制的位置。

(对我来说,从根本上重定向 stderr 流来实现这一点对我来说是一个令人惊讶的设计——并且使用 NSLog 级别之上的包装器,如果你愿意的话,你可以很容易地选择将输出发送到这两个地方。)

于 2010-01-20T16:58:11.837 回答