我编写了一个 c++ 应用程序,要在运行板载 Linux 操作系统的嵌入式设备上运行。出于调试目的,我在应用程序中插入了 std::cout 语句。
我使用以下命令运行应用程序,将所有日志消息存储到一个文件中
./TestApplication > /var/log/test_log
正如预期的那样,所有日志消息都存储在test_log
中。但是,当应用程序面临断言时,断言消息不会存储在日志文件中。
我的应用程序依赖于许多第三方包,每个包都有自己的自定义断言函数。因此,为整个应用程序编写我自己的自定义断言函数将太困难了,因为我还需要满足第三方自定义断言的需求。
有没有一种简单的方法可以将我的所有日志和断言消息转储到日志文件中?
在POSIX系统(如Linux或macOS(上,有两个输出流:
- 标准输出(
std::cout
在C++中使用( - 标准误差(C++中由
std::cerr
和std::clog
使用(
使用纯>
shell重定向运算符,您可以仅重定向标准输出,而不是标准错误(例如,写入断言消息(。
您需要告诉 shell 标准错误应该与标准输出相同,使用 2>&1
:
./TestApplication > /var/log/test_log 2>&1
请注意,重定向的顺序很重要。
在 Bash 手册页中阅读有关重定向的更多信息。
如果您想知道 2>&1
中的数字,它是标准文件描述符编号。描述符0
是标准输入(您用std::cin
阅读(;描述符1
是标准输出;描述符2
是标准误差。
该命令将标准输出重定向到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"(