c++ - 将断言消息写入日志文件
问题描述
我编写了一个 c++ 应用程序,可以在运行板载 Linux 操作系统的嵌入式设备上运行。出于调试目的,我在我的应用程序中插入了 std::cout 语句。
我使用以下命令运行应用程序,将所有日志消息存储到文件中
./TestApplication > /var/log/test_log
正如预期的那样,所有日志消息都存储在test_log
. 但是当应用程序面临一个断言时,断言消息不会存储在日志文件中。
我的应用程序依赖于许多第三方包,每个包都有自己的自定义断言功能。因此,为整个应用程序编写我自己的自定义断言函数将太困难,因为我还需要迎合第三方自定义断言。
有没有一种简单的方法可以将我的所有日志和断言消息转储到日志文件中?
解决方案
在 POSIX 系统(如 Linux 或 macOS)上,有两个输出流:
- 标准输出(
std::cout
在 C++ 中使用) - 标准错误(由 C++ 使用
std::cerr
和std::clog
在 C++ 中使用)
使用普通的>
shell 重定向运算符,您只重定向标准输出,而不是标准错误(例如,写入断言消息的地方)。
您需要告诉 shell 标准错误应该与标准输出相同,使用2>&1
:
./TestApplication > /var/log/test_log 2>&1
请注意,重定向的顺序很重要。
如果您想知道 中的数字2>&1
,那是标准的文件描述符数字。描述符0
是标准输入(你用 阅读std::cin
);描述符1
是标准输出;描述符2
是标准错误。
推荐阅读
- sql - 根据 Bigquery 计划查询中的日期动态更改 FROM 表名
- reactjs - 在 React Hooks 中输入文本时,antd Select Option 不呈现
- blazor-webassembly - Blazor WASM TargetFrameworks 网络标准 2.1 和 net5.0
- javascript - 单击按钮时切换脚本执行
- android - 无法加载 github.com 的信息
- assembly - 二叉搜索树插入程序集 x86
- css - @media 查询中的 CSS 字体大小在旋转后不会变回
- javascript - 谷歌表格隐藏网址
- configuration - 这个“编辑小部件”视图(适用于 iOS 14 小部件)的名称是什么?我该如何定义这样的东西?
- java - java继承子类扩展到父类时没有返回值