我已经编写了一个c ++应用程序,可以在运行Linux机载的嵌入式设备上运行。为了调试,我在应用程序中插入了std :: cout语句。
我使用以下命令运行该应用程序以将所有日志消息存储到文件中
./TestApplication > /var/log/test_log
所有日志消息均按预期存储在test_log
中。但是,当应用程序遇到断言时,断言消息不会存储在日志文件中。
我的应用程序依赖于许多第三方程序包,每个程序包都有自己的自定义断言功能。因此,为整个应用程序编写我自己的自定义断言函数将非常困难,因为我还需要满足第三方自定义断言。
是否有一种简单的方法可以将我的所有日志和断言消息转储到日志文件中?
答案 0 :(得分:2)
在POSIX系统(例如Linux或macOS)上,有两个输出流:
CHAT_TWILIO_API_SECRET
使用)std::cout
和std::cerr
使用)使用普通的std::clog
shell重定向操作符,您仅重定向标准输出,而不重定向标准错误(例如,写入断言消息的地方)。
您需要使用>
告诉shell标准错误应该与标准输出相同:
2>&1
请注意,重定向顺序很重要。
在redirection中了解有关Bash manual page的更多信息。
如果您想知道./TestApplication > /var/log/test_log 2>&1
中的数字,它是标准的文件描述符数字。描述符2>&1
是标准输入(您使用0
阅读);描述符std::cin
是标准输出;描述符1
是标准错误。
答案 1 :(得分:1)
该命令将stdout重定向到 test_log 文件。断言消息将写入stderr流。您应该尝试:
./TestApplication 1>/var/log/test_log 2>/var/log/test_log_errors
或
./TestApplication 2>&1 > /var/log/test_log
如果要全部保存在一个文件中(2>1&
表示“将stderr重定向到stdout”)