我的结论是,直接从打印的内容中获取日志是最好的方法,但我在网上找不到任何人询问如何做到这一点。
如今的控制台是终端仿真器。原始终端的输出进入打印机,无法(轻松)读回。
应用程序stdout
和stderr
(控制台)流是只写的。此外,在 Windows 和 Unix/Linux 中,您可以使用(pipe) 在您的应用程序和另一个应用程序之间创建管道 IPC将程序的(控制台)输出(或两者stderr
之一)通过管道传输到另一个应用程序中。该 IPC 管道是只写的,您的应用程序可能无法从中读取。stdout
|
stdout
stdin
您可能能够访问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
。