NSLog()同时控制台和文件

时间:2012-03-08 15:02:15

标签: objective-c nslog

我想将NSog()重定向到文件,但仍然要在控制台中查看输出。 我知道stderr可以使用以下方式重定向到文件:

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

但在将其重定向到文件后,控制台输出中不再显示日志。

我可以在NSLog()周围构建一个自定义包装器,但是在应用程序崩溃的那一刻,我不会记录写入stderr的崩溃日志。

我还在试验dup()和其他复制文件描述符的方法,但是输出是文件或控制台中的ether,而不是两者。

此处提出类似问题: Write stderr on iPhone to both file and console 但没有接受的答案,或建议使用NSLog()包装。

有没有人知道如何管理这项工作? 提前完成。

更新:重定向最重要的部分是将系统错误日志( stderr )写入控制台和文件。

2 个答案:

答案 0 :(得分:29)

我们实施的方式是:

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

这基于一般假设,即如果连接了控制台,则您不需要将这些日志存储在文件中,因为您已经在调试。因此,无论何时连接控制台,都会在那里打印日志,否则会保存到文件中。

答案 1 :(得分:8)

According to the docs,您需要一个自定义日志工具。

您至少需要一个接收可变参数并打印到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日志框架。

Looking for a Specific Cocoa Logging Framework

相关问题