NSLog() 到控制台和文件
Posted
技术标签:
【中文标题】NSLog() 到控制台和文件【英文标题】:NSLog() to both console and file 【发布时间】:2012-03-08 15:02:15 【问题描述】:我想将NSog()
重定向到文件,但仍要在控制台中查看输出。
我知道stderr
可以使用以下命令重定向到文件:
freopen("file.log", "a+", stderr);
但在将其重定向到文件后,控制台输出中不再显示该日志。
我可以围绕NSLog()
构建一个自定义包装器,但我不会在应用程序崩溃时获得写入stderr
的崩溃日志。
我也在尝试使用dup()
和其他复制文件描述符的方法,但输出是在文件或控制台中的以太,从来没有在两者中。
这里提出了类似的问题: Write stderr on iPhone to both file and console 但没有接受的答案,或者建议使用 NSLog() 包装器。
有人知道如何管理这项工作吗? 提前谢谢。
更新: 重定向最重要的部分是将系统错误日志 (stderr) 写入控制台和文件。
【问题讨论】:
如果你做两个单独的日志,一个发送到文件,一个发送到控制台,但保持不变? 你建议如何管理这个?最重要的是将系统错误日志写入控制台和文件。NSLog
默认日志到控制台,也许你可以从那里提取你的日志***.com/questions/7150849/…
对不起,我不明白你这样做是为了错误日志,我浏览了一下并认为它只是使用 NSLog
【参考方案1】:
我们实现的方式是:
if (!isatty(STDERR_FILENO))
// Redirection code
这是基于一般假设,即如果连接了控制台,则无需将这些日志存储在文件中,因为您已经在调试。因此,无论何时附加控制台,日志都会在那里打印,否则会保存到文件中。
【讨论】:
【参考方案2】: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
【讨论】:
谢谢,这很好,但请查看我更新的问题。我正在寻找某种方法将系统的 stderr 日志获取到控制台和文件,而不仅仅是我的自定义日志。谢谢。 @Miroslav:如果不对我给你的内容进行类似的更改,我认为这是不可能的。以上是关于NSLog() 到控制台和文件的主要内容,如果未能解决你的问题,请参考以下文章