0

我的程序中有两个记录器。一个是我在 gui 中制作的,一个超级复杂但设计得非常好,可以打印到控制台。我正在尝试从漂亮的控制台记录器获取输出到渲染的记录器。我已经在阳光下尝试了一切来让它工作,但我似乎无法弄清楚(由于我对其他记录器(spdlog)的代码缺乏理解。)我的结论是直接从打印的是最好的方法,但我在网上找不到任何人询问如何做到这一点。我已经看到了一些问题,但他们只是发布代码作为答案,并没有真正解释发生了什么。我的问题:有没有办法从控制台获取打印出来的语句,以及这样做会带来哪些性能问题/并发症。

例如,如果我做std::cout << "hello!" << std::endl;一些 printf 语句,我希望能够在代码中进一步向下抓取“hello!”。

4

1 回答 1

1

我的结论是,直接从打印的内容中获取日志是最好的方法,但我在网上找不到任何人询问如何做到这一点。

如今的控制台是终端仿真器。原始终端的输出进入打印机,无法(轻松)读回。

应用程序stdoutstderr(控制台)流是只写的。此外,在 Windows 和 Unix/Linux 中,您可以使用(pipe) 在您的应用程序和另一个应用程序之间创建管道 IPC将程序的(控制台)输出(或两者stderr之一)通过管道传输到另一个应用程序中。该 IPC 管道是只写的,您的应用程序可能无法从中读取。stdout|stdoutstdin

您可能能够访问cmd.exe控制其 Windows 控制台窗口的 Windows 帧缓冲区的内容,但这不会是您写入的数据的逐字字节精确副本,stdout因为Windows 控制台解释了转义序列

如果stdout被重定向到一个文件中,您可以重新打开该文件进行阅读,但没有可移植的方式来重新打开该文件。

换句话说,没有可移植的方式来读取控制台输出。


我已经在阳光下尝试了一切来让它工作,但我似乎无法弄清楚(由于我对其他记录器(spdlog)的代码缺乏理解。

我敢打赌,您还没有尝试阅读spdlog文档,尤其是带有 multi sinks 的记录器。接收器是一种输出抽象,其实现可以写入文件、内存或两者。您需要将自己的接收器附加到spdlog打印到您的 UI 中。

base_sink从抽象成员函数派生您的接收器并实现:

  • virtual void sink_it_(const details::log_msg &msg) = 0;打印到UI, 和,
  • virtual void flush_() = 0;什么都不做。

然后将您的接收器类的一个对象附加到该对象spdlog

于 2019-12-02T15:22:27.117 回答