【问题标题】:How to disable std::clog logging from source code?如何从源代码禁用 std::clog 日志记录?
【发布时间】:2016-08-26 07:44:25
【问题描述】:

在开发代码时,我有许多控制台日志记录 (std::clog) 和一些控制台输出 (std::cout)。但是现在,我想在线提交我的源代码,我想禁用所有控制台日志记录 (clog) 但保留控制台输出 (cout)

我当然可以评论我所有的//std::clog,但是有没有更好的方法来禁用我的源文件中的所有日志记录?

【问题讨论】:

  • this answer 适合您的问题吗?
  • 或者,std::filebuf f; auto old = std::clog.rdbuf(&f); 在 main 开头,std::clog.rdbuf(old); 在结尾可以解决问题。
  • @Quentin 它可以工作 std::clog.setstate(std::ios_base::failbit); 仅删除 clog 消息,并仍然保留 cout。谢谢...(你能把它写成答案吗)。
  • 无论如何,它与使用ofstream.rdbuf() 有什么不同,哪个更好?似乎.setstate(std::ios_base::failbit); 比使用rdbuf 更短且更简单地删除阻塞消息
  • @Yeo 我已将 Andreas 的答案复制为 CW。

标签: c++ c++11


【解决方案1】:

您可以重定向 clog,创建自己的 ofstream 并使用rdbuf 函数。

std::ofstream nullstream;
std::clog.rdbuf(nullstream.rdbuf());

【讨论】:

    【解决方案2】:

    Andreas Papadopoulos' answer 复制到一个稍微不同的问题——一定要在那儿给他点赞!


    当然,你可以(example here):

    int main() {
        std::clog << "First message" << std::endl;
    
        std::clog.setstate(std::ios_base::failbit);
        std::clog << "Second message" << std::endl;
    
        std::clog.clear();
        std::clog << "Last message" << std::endl;
    
        return 0;
    }
    

    输出:

    First message
    Last message
    

    这是因为将流置于fail 状态会使其静默丢弃任何输出,直到故障位被清除。

    【讨论】:

    • 作为记录,我已经做出了这个 CW 答案,因为链接的问题不同(它还询问恢复流),它的呈现不如这个,并且接受的答案绕过了问题而不是解决它。
    猜你喜欢
    • 1970-01-01
    • 2011-01-08
    • 1970-01-01
    • 2022-06-21
    • 1970-01-01
    • 1970-01-01
    • 2018-12-24
    • 2020-01-17
    • 2016-07-04
    相关资源
    最近更新 更多