如何在C 中自动汇总日志消息并自动解锁互斥X

How to flush a log message and unlock a mutex automatically in C++?

本文关键字:消息 解锁 日志      更新时间:2023-10-16

我写了这个记录器。它可以正常工作,但是我无法做任何事情。

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

ulog锁定c 11 mutex并开始在文件流上写作。
Uloge冲洗溪流并解锁静音。

我想通过此语法获得相同的结果:

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

所以我希望齐平和解锁在生产线末端自动称为。

哪种可能的方法?

  • 我尝试设置ios::unitbuf标志,但这迫使每个<<操作员都齐平,这并不是SSD佩戴的理想选择。而且它没有解锁哑光。
  • 我尝试在ulog中定义一个临时对象,其驱动器会冲洗并解锁,但这将日志线放在其自己的代码块中: { uLOG(warning) << 123; }

参考

您需要重新设计记录框架,以便您实例化的uLOG是A class ,并且其destuructor可以完成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;

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

日志:警告 - 日志消息123(日志结束)

此解决方案不需要使用牙套,因此可以在单键式的未支撑if或环中使用。

您的第二种方法是正确的,如果正确实现,则不需要括号。你是用宏做的吗?这里不需要它们。

ulog应该是返回日志作者类的临时对象的函数。正如您概述的那样,它应该锁定CTOR,齐平和DTOR中解锁,并具有模板操作员&lt;&lt;对于所有类型的类型,只需将呼叫转发到实际日志目的地。