将断言消息写入日志文件

时间:2019-06-03 06:56:36

标签: c++ linux embedded assert

我已经编写了一个c ++应用程序,可以在运行Linux机载的嵌入式设备上运行。为了调试,我在应用程序中插入了std :: cout语句。

我使用以下命令运行该应用程序以将所有日志消息存储到文件中

./TestApplication > /var/log/test_log

所有日志消息均按预期存储在test_log中。但是,当应用程序遇到断言时,断言消息不会存储在日志文件中。

我的应用程序依赖于许多第三方程序包,每个程序包都有自己的自定义断言功能。因此,为整个应用程序编写我自己的自定义断言函数将非常困难,因为我还需要满足第三方自定义断言。

是否有一种简单的方法可以将我的所有日​​志和断言消息转储到日志文件中?

2 个答案:

答案 0 :(得分:2)

在POSIX系统(例如Linux或macOS)上,有两个输出流:

  1. 标准输出(在C ++中由CHAT_TWILIO_API_SECRET使用)
  2. 标准错误(在C ++中由std::coutstd::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”)