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)
这基于一般假设,即如果连接了控制台,则您不需要将这些日志存储在文件中,因为您已经在调试.因此,无论何时连接控制台,都会在那里打印日志,否则会保存到文件中.
根据文档,您将需要一个自定义日志工具.
您至少需要一个函数,它接受可变参数并打印到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日志框架.