NSLog()同时控制台和文件

Mir*_*vac 25 objective-c nslog

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

freopen("file.log", "a+", stderr);
Run Code Online (Sandbox Code Playgroud)

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

我可以构建一个自定义包装器,NSLog()但我不会得到stderr在应用程序崩溃时写入的记录崩溃日志.

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

这里也提出了类似的问题: 在iPhone上将stderr写入文件和控制台, 但没有接受答案,或建议使用NSLog()包装器.

有没有人知道如何管理这项工作?Thanx提前.

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

Sai*_*esh 29

我们实施的方式是:

if (!isatty(STDERR_FILENO)) {
    // Redirection code
}
Run Code Online (Sandbox Code Playgroud)

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


Jer*_*myP 8

根据文档,您将需要一个自定义日志工具.

您至少需要一个函数,它接受可变参数并打印到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
}
Run Code Online (Sandbox Code Playgroud)

或者有Cocoa日志框架.

寻找特定的可可记录框架