使日志记录运算符过载<<设计的潜在问题

Potential problems with a design that overloads << operator for logging

本文关键字:lt 问题 日志 记录 运算符      更新时间:2023-10-16

我想写一个类似于std::cout使用<<运算符的类。 我希望能够在使用一系列<<运算符的代码段的开头获取互斥锁,并在语句末尾发布该互斥锁。

例如:

logger << "Information blah "<< 1;

如果没有锁,事情可能会在多线程操作中的"信息废话"和 1 之间交错。

这些类的设计是否存在一些主要问题? 我知道有大量的日志记录库,我只是在玩一种在一系列<<运算符开始时维护互斥锁并在最后释放互斥锁的方法。

class Logger;
class LockedLogger
{
    public:
        LockedLogger(Logger & logger):logger_(logger),lock_(new std::lock_guard<std::mutex>(logger.outputMutex_)) {};
        template<typename T>
        const LockedLogger & operator <<(T t) const{//Logging Code.}    
    private:
        LockedLogger & logger_;
        std::shared_ptr<std::lock_guard<std::mutex> > lock_;
};

class Logger
{
    public:
        Logger();
        template<typename T>
        LockedLogger operator << (T t){return LockedLogger(*this) << t;}
    private:
        std::mutex outputMutex_;
        friend class LockedLogger;
};
Logger logger;

如果您选择使用锁定的记录器,那么当一个线程正在记录并可能准备要记录的信息/字符串时,您将停止其他线程。

相反,你为什么不想办法在没有锁的情况下准备要记录的信息/字符串(例如,进入函数/范围本地或线程本地对象/字符串),然后一次记录整个信息/字符串,保持同步部分尽可能短。