我想将NSog()
重定向到文件,但仍然要在控制台中查看输出。
我知道stderr
可以使用以下方式重定向到文件:
freopen("file.log", "a+", stderr);
但在将其重定向到文件后,控制台输出中不再显示日志。
我可以在NSLog()
周围构建一个自定义包装器,但是在应用程序崩溃的那一刻,我不会记录写入stderr
的崩溃日志。
我还在试验dup()
和其他复制文件描述符的方法,但是输出是文件或控制台中的ether,而不是两者。
此处提出类似问题: Write stderr on iPhone to both file and console 但没有接受的答案,或建议使用NSLog()包装。
有没有人知道如何管理这项工作? 提前完成。
更新:重定向最重要的部分是将系统错误日志( stderr )写入控制台和文件。
答案 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日志框架。