【问题标题】:C++ Logging using std::ostream and std::cout使用 std::ostream 和 std::cout 的 C++ 日志记录
【发布时间】:2017-10-05 20:10:35
【问题描述】:

我想编写一个程序,让用户通过设置程序显示进度或禁用它来控制包的日志记录。

我知道std::coutstd::ostream,区别在于std::cout 将结果重定向到标准输出。

我希望我的班级有一个 std::ostream 成员,我可以记录所有内容。然后如果用户启用显示,该成员将附加到std::cout并显示结果,否则不会。

我的想法是这样的:

class log {
private:
    std::ostream display;
public:
    void func();
    void show_display();
}

void log::func(){
    display << "called by func";
}
void log::show_display(){
    // redirect display to standard output
}

有没有类似上面的方法可以做到这一点?如果没有,我怎样才能得到类似的结果?

谢谢。

【问题讨论】:

  • "不同之处在于 std::cout 将结果直接显示在屏幕上。" - 不,它写入标准输出 - 你可以从你的 shell 重定向它。
  • @NeilButterworth 这绝对正确,我很抱歉这个错误。我会编辑
  • 您可以将其用于忽略输出的流:stackoverflow.com/a/11826666/951890
  • @VaughnCato 感谢您的建议,我希望可以随时控制将流重定向到标准输出。
  • 您可以让display() 成为返回std::ostream&amp; 的函数,该函数可以是无操作流,也可以是std::cout,具体取决于是否启用了日志记录。

标签: c++ logging cout ostream


【解决方案1】:

流句柄不是可复制的对象,也没有任何std::ostream 用户可以实例化的对象。因此,您的书面课程无法正常工作。你可以做的是存储一个指针:

#include <iostream>

class log {
  std::ostream* out_;

public:
  void func() {
    if (out) { *out << "called by func"; }
    // ...
  }

  void show_display() {
    out = &std::cout;
  }

  void hide_display() {
    out = nullptr;
  }
};

如果您计划构建一个更通用的日志记录系统,您应该考虑记录到禁用的输出是否需要评估操作数;用户可能希望在禁用日志记录时使用诸如log &lt;&lt; expensive_function(); 之类的日志语句很便宜。

【讨论】:

  • 我必须承认我有这个想法,但希望有另一种方式,不涉及每次我想登录时检查它是否不是nullptr。我还不如只写一个函数write 进行检查并将其放入流中。
  • @Everyone:您还可以创建自己的不写任何内容的记录器对象,并无条件地记录到该对象并插入该对象而不是空指针。
  • 我想我最终会这样做,因为我可以控制std::cout提出的线程安全问题
猜你喜欢
  • 1970-01-01
  • 2010-09-26
  • 1970-01-01
  • 2020-07-12
  • 2018-05-31
  • 2017-01-18
  • 1970-01-01
  • 1970-01-01
  • 2023-03-09
相关资源
最近更新 更多