boost的设计图如下:
这个图流程比较清晰,但数据细节上不够,我重新画了一个
Boost.log设计与log4j相似:
- 用Logger输入数据,输入的数据配合设置的属性即为log record
- Log record经过过滤和format到达最终的sink,输出到console/文件等位置
- Logger和sink不绑定,数据输入后完全根据规则经logging core分配到对应的sink
各部分介绍 :
Log record
:一组信息(即一组attribute),经流程处理后,会成为一条log信息
Attribute
:函数对象,在需要时生成最终数据,如行计数、时间戳等
Attribute value
:由Attribute
获得的值 ,可以是 “int/string/…” 各种数据类型
(Attribute) value visitation
:一个用户定义的访问函数,属性事先知道attribute的类型
(Attribute) value extraction
:从log record
提取数据,需要事先知道数据的类型
Log sink
:log record的最终运算,定义了数据被保存或处理的方式
Log source
:用户log的输入点,同时管理一组属性,如severity等
Log filter
:判断log record
是否被丢弃,log record不被丢弃才会最终成功log信息
Log formatter
:将log record
的信息合成log信息,包括从attribute
获得attribute_value
Logging core
:管理logger与sink间的连接,全局对象
i18n
:Internationalization的简写,用来处理宽字符
TLS
:Thread-local storage,各线程独立的值
RTTI
:Run-time type information,c++特性。支持dynamic_cast
和 typeid
运算符
boost.log下的命名空间太多,为了方便使用,例子中都使用了如下的简写:
namespace logging = boost::log;
namespace sinks = logging::sinks;
namespace expr = logging::expressions;
namespace attrs = logging::attributes;