【问题标题】:NSLog() to both console and fileNSLog() 到控制台和文件
【发布时间】: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 默认日志到控制台,也许你可以从那里提取你的日志stackoverflow.com/questions/7150849/…
  • 对不起,我不明白你这样做是为了错误日志,我浏览了一下并认为它只是使用 NSLog

标签: objective-c 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:如果不对我给你的内容进行类似的更改,我认为这是不可能的。
    猜你喜欢
    • 2015-09-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-30
    • 2012-03-27
    相关资源
    最近更新 更多