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_valueLogging 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;