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() 到控制台和文件的主要内容,如果未能解决你的问题,请参考以下文章

NSLog 不打印到控制台

如何 NSLog 进入文件

设备控制台中仅显示崩溃日志

将实例 ID 打印到 NSLog?

来自 C 代码的 NSLog 样式调试消息

有啥方法可以用 NSLog 进行彩色打印?