boost之log的core

结构

core
filter
sink
attribute_set
record

core

core
- implementation* m_impl
implementation
+ sink_list m_sinks
+ shared_ptr< sinks::sink >m_default_sink
+ attribute_set m_global_attributes
+ filter m_filter
+ exception_handler_type m_exception_handler
+ bool m_enabled
lazy_singleton<implementation, core_ptr>

单例

lazy_singleton

懒汉单例模板类,有两个类型参数,一个是子类,一个是存储类
子类需要实现init_instance

lazy_singleton<DerivedT, StorageT>
+static StorageT& get()
+static void init_instance()
#static StorageT& get_instance()

singleton

饿汉单例,继承lazy_singleton

singleton<DerivedT, StorageT>
+ static StorageT& instance
lazy_singleton

初始化

通过static core_ptr get()来初始化,其过程为

BOOST_LOG_API core_ptr core::get()
{
    return implementation::get();
}

会调用implementation的静态get方法,由于implementation继承lazy_singleton,其调用的是 lazy_singleton的get方法

template< typename DerivedT, typename StorageT = DerivedT >
class lazy_singleton {
public:
	static StorageT& get()
    {
        BOOST_LOG_ONCE_BLOCK()
        {
            DerivedT::init_instance();
        }
        return get_instance();
    }
};

会调用implementation的init_instance方法,其会调用lazy_singleton的get_instance方法

static void init_instance()
 {
     base_type::get_instance().reset(new core());
 }

lazy_singleton的get_instance方法得到shared_ptr<core>

static StorageT& get_instance()
{
    static StorageT instance;
    return instance;
}

sink

由前端sink和后端sink来处理
在这里插入图片描述

sink抽象接口

sink
+bool will_consume(attribute_value_set const& attributes)
+void consume(record_view const& rec)
+void flush()

BOOST_LOG_INLINE_GLOBAL_LOGGER_DEFAULT

其定义为

#define BOOST_LOG_INLINE_GLOBAL_LOGGER_DEFAULT(tag_name, logger)\
    BOOST_LOG_INLINE_GLOBAL_LOGGER_INIT(tag_name, logger)\
    {\
        return logger_type();\
    }

BOOST_LOG_INLINE_GLOBAL_LOGGER_INIT定义为

#define BOOST_LOG_INLINE_GLOBAL_LOGGER_INIT(tag_name, logger)\
    BOOST_LOG_GLOBAL_LOGGER(tag_name, logger)\
    inline BOOST_LOG_GLOBAL_LOGGER_INIT(tag_name, logger)

BOOST_LOG_GLOBAL_LOGGER定义结构体

#define BOOST_LOG_GLOBAL_LOGGER(tag_name, logger)\
    struct tag_name\
    {\
        typedef logger logger_type;\
        enum registration_line_t { registration_line = __LINE__ };\
        static const char* registration_file() { return __FILE__; }\
        static logger_type construct_logger();\
        static inline logger_type& get()\
        {\
            return ::boost::log::sources::aux::logger_singleton< tag_name >::get();\
        }\
    };

BOOST_LOG_GLOBAL_LOGGER_INIT定义construct_logger方法

#define BOOST_LOG_GLOBAL_LOGGER_INIT(tag_name, logger)\
    tag_name::logger_type tag_name::construct_logger()

BOOST_LOG_INLINE_GLOBAL_LOGGER_DEFAULT宏的最终结果为

struct tag_name
    {
        typedef logger logger_type;
        enum registration_line_t { registration_line = __LINE__ };
        static const char* registration_file() { return __FILE__; }
        static logger_type construct_logger();
        static inline logger_type& get()
        {
            return ::boost::log::sources::aux::logger_singleton< tag_name >::get();
        }
    };
tag_name::logger_type tag_name::construct_logger()
{
	return logger_type();
}

BOOST_LOG

定义为

#define BOOST_LOG(logger) BOOST_LOG_STREAM(logger)

宏BOOST_LOG_STREAM定义为

#define BOOST_LOG_STREAM(logger)\
    BOOST_LOG_STREAM_INTERNAL(logger, BOOST_LOG_UNIQUE_IDENTIFIER_NAME(_boost_log_record_))

宏BOOST_LOG_STREAM_INTERNAL定义为

#define BOOST_LOG_STREAM_INTERNAL(logger, rec_var)\
    for (::boost::log::record rec_var = (logger).open_record(); !!rec_var;)\
        ::boost::log::aux::make_record_pump((logger), rec_var).stream()

BOOST_LOG(logger)是最终结果为

::boost::log::record rec_var = (logger).open_record();
::boost::log::aux::make_record_pump((logger), rec_var).stream()
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

kgduu

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值