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

Pie*_*tro 2 c++ logging mutex flush c++11

我写了这个记录器.它工作正常,但有一些我无法做到的事情.

uLOG(warning) << "Test log message " << 123 << uLOGE;
Run Code Online (Sandbox Code Playgroud)

uLOG锁定C++ 11互斥锁并开始在文件流上写入.
uLOGE刷新流并解锁互斥锁.

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

uLOG(warning) << "Test log message " << 123;
Run Code Online (Sandbox Code Playgroud)

所以我希望在行尾自动调用flush和unlock.

哪种方法可以做到?

  • 我尝试设置ios::unitbuf标志,但这会强制每个<<操作员齐平,不适合SSD佩戴.它并没有解锁互斥锁.
  • 我尝试在uLOG中定义一个临时对象,其析构函数将刷新并解锁,但这会强制将日志行放在自己的代码块中: { uLOG(warning) << 123; }

参考

Som*_*ude 5

您需要重新设计日志框架,因此这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;
Run Code Online (Sandbox Code Playgroud)

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

Log: warning - log message123 (end of log)

此解决方案不应要求使用大括号,因此可以在单语句中使用非支撑if或循环.