结构
core
单例
lazy_singleton
懒汉单例模板类,有两个类型参数,一个是子类,一个是存储类
子类需要实现init_instance
singleton
饿汉单例,继承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抽象接口
宏
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()