我正在尝试保存我编写的应用程序的输出。当我尝试通过重定向 stdout 来保存输出时,结果文件为空白。
这是我在 Terminal.app (OS X 10.9.2) 中输入的内容:
./AppName > test.txt
该应用程序通过 NSLog() 输出文本。
我在 Terminal.app 中获得了 NSLog() 输出,但生成的 text.txt 文件为空白。我了解到可能需要通过将 ./ 替换为文件路径来运行该应用程序:
appPath > text.txt
同样的事情也发生了。
有人能向我解释一下这个问题是什么吗?
答案1
您需要合并STDERR
到STDOUT
。说:
./AppName > test.txt 2>&1
你会看到输出在test.txt
。
答案2
NSLog() 记录到 Apple 系统日志 (ASL) 设备,而不是 stdout 或 stderr。
前往 Console.app 查看“所有消息”日志流或syslog
在终端中输入。此外,您可以设置过滤器,让 ASL 将您应用中的所有日志消息发送到特定的文本文件。请参阅 ASL、syslog 等的手册页。
答案3
首先介绍一些背景信息:
默认情况下,普通的 unix 程序以两个文件描述符开始:StdOut 和 StdErr。StdOut
通过文件描述符编号 1 完成。StdErr
通过文件描述符编号 2 完成。
重定向标准输出通过 完成1>
。示例./App 1> my_log.txt
重定向标准错误通过 完成2>
。示例./App 2> my_errors.txt
(>
和1>
是一样的,只不过是缩写形式)
这可以实现一些有用的功能,例如仅记录错误,或将正常输出记录到一个文件,将错误记录到另一个文件。或者非常有用的情况是将正常输出记录到一个文件,同时仍让任何错误显示在屏幕上。
将 ./Appname 替换为完整文件路径不会产生任何影响。一个从当前目录启动应用程序,一个指定应用程序的完整路径。两者都不会影响文件描述符。
现在我们终于可以回答你的问题了:
您想要做的是记录 NSlog() 的输出。为此,您首先要找出 nslog 正在写入的位置。
根据这是我们的姊妹网站 StackOverflow 上的一个问题NSLog 输出到 ASL(Apple 版本的 syslog)和控制台。
因此,您要么想要读取系统日志的输出,要么将日志的输出更改为可以轻松拦截它的位置。例如freopen([path cStringUsingEncoding:NSASCIIStringEncoding], "a+", stderr);
我链接的 [so] 帖子回答了几种如何做到这一点的方法。如果你在帖子中添加更多详细信息(例如,是否允许修改应用程序?),那么我可以更详细地回答。