gpt4 book ai didi

c++ - 如何在 C++ 中自动刷新日志消息并解锁互斥量?

转载 作者:搜寻专家 更新时间:2023-10-30 23:52:57 24 4
gpt4 key购买 nike

这是我写的logger .它工作正常,但有些事情我无法做到。

uLOG(warning) << "Test log message " << 123 << uLOGE;

uLOG 锁定 C++11 互斥量并开始写入文件流。
uLOGE 刷新流并解锁互斥体。

我想用这个语法得到相同的结果:

uLOG(warning) << "Test log message " << 123;

所以我希望在行尾自动调用刷新和解锁。

哪种方法可行?

  • 我尝试设置 ios::unitbuf标志,但这会强制刷新每个 <<运营商,不适合 SSD 佩戴。而且它不会解锁互斥体。
  • 我尝试在 uLOG 中定义一个临时对象,其析构函数将刷新和解锁,但这会强制将日志行放入其自己的代码块中:{ uLOG(warning) << 123; }

Reference

最佳答案

您需要重新设计您的日志记录框架,使 uLOG 成为您实例化的,并且其析构函数执行您的 uLOGE 宏。


非常简单的例子:

struct uLOG
{
uLOG(std::string const& type)
{
std::cout << "Log: " << type << " - ";
}

template<typename T>
uLOG& operator<<(T const& output)
{
std::cout << output;
return *this;
}

~uLOG()
{
std::cout << " (end of log)" << std::endl;
}
};

// ...
uLOG("warning") << "log message" << 123;

以上,在一个合适的程序中,应该打印

Log: warning - log message123 (end of log)

此解决方案不需要使用大括号,因此可用于单语句非大括号 if 或循环。

关于c++ - 如何在 C++ 中自动刷新日志消息并解锁互斥量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42790369/

24 4 0