【问题标题】:How can I send to both Google Logger and cout?如何同时发送到 Google Logger 和 cout?
【发布时间】:2017-05-01 04:18:39
【问题描述】:

我在 C++ 项目中使用 google logger (glog),其中源代码包含信息项和进度的打印输出:

std::cout << some_useful_stuff << "\n";

我可以使用 GLOG 来记录信息项:

LOG(INFO) << some_useful_stuff << "\n"; \\ gets echoed to stdout

我无法更改整个代码库中的所有 std::cout 语句(因为我正在使用来自第三方的一些子存储库等,并且无法向它们添加我自己的日志记录语句),这阻止我使用 if-else 构造(无论如何,这会很丑陋,将每个输出语句包装在逻辑中)。

那么我如何将stdout 输出复制到 GLog?

std::cout << some_useful_stuff << "\n"; \\ message also goes to LOG(INFO)

可能有用:我实际上不需要同时发生这种情况;有一个像 {CONSOLE, LOGS, BOTH} 这样的选择很有用,但我可以忍受在 {CONSOLE, LOGS} 之间更简单的选择。

另外 - 经验丰富的程序员,但 C++ 新手,所以如果这非常简单;道歉 - 提前致谢!

【问题讨论】:

  • 感谢您的编辑,@Borgleader... 击败了我 ;)
  • boost::iostreams::tee_device 对于同时写入两个流很有用。基本上是两个流的包装器。

标签: c++ c++11 logging glog


【解决方案1】:

不确定 glog,但通常我们使用 dup2 系统调用将一个文件处理程序的输出重定向到另一个。

例如在您的情况下,让所有 std::cout 写入 glog 使用的日志文件即可

dup2(glog_file_handler,stdout);

如果您可以获取 glog 正在写入的日志文件的文件句柄,这将起作用。详情请参考http://man7.org/linux/man-pages/man2/dup.2.html

希望这会有所帮助。

附:如果您的程序有多个线程/进程写入同一个 glog 文件并且 glog 确实同步写入日志文件,这将不起作用

【讨论】:

  • 谢谢@A.N. glog 异步写入;但我很难在谷歌库中找到文件处理程序!我会进一步调查。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-02-12
  • 1970-01-01
  • 1970-01-01
  • 2021-12-04
  • 1970-01-01
  • 1970-01-01
  • 2014-05-07
相关资源
最近更新 更多