说明:文章内容为学习Boost Log 文档提炼记录,核心内容来自官方文档。
Boost.Log官方文档
Boost.Log 简介
Boost被称为“准”标准库,相当于STL的延续和扩充,设计和STL比较接近,大量利用了泛型模板让复用达到最大化,因此在项目中可作为高质量的第三方库使用。Log库经过多次review该进, 终于在1.54版本才开始正式发布,根据其官方说明,Log 库提供了使用简单、扩展性好、性能优良的组件,因此在项目中选用log 库时可将Boost.Log 纳入候选。 但使用也需要注意:log和其它部分库类似在使用时需要编译,并且对其他库的依赖很厉害,需要相关Boost.Filesystem,Boost.System,Boost.DateTime,Boost.Thread,Boost.Regex 库的支持。
Boost.Log 框架介绍
- Boost.Log框架中核心概念
日志记录(Record):一个独立的消息包,该消息包不是实际写到日志里的消息,而只是一个候选的消息。
属性及属性值(Attribute):属性为日志记录中的一个消息片,它的值可以是各种数据类型。
日志槽(Sink):日志写向的目标,它要定义日志被写向什么地方,以及如何写。
日志源(Source):应用程序写日志时的入口,其实质是一个logger对象的实例。
日志过滤器(Filter):决定日志记录是否要被记录的一组判断。
日志格式(Formatter):决定日志记录输出的实际格式。
日志核心(Core):维护者日志源、日志槽、日志过滤器等之间的关系的一个全局中的实体,在初始化logging library时用到。
- Boost.Log 框架分析
(图片选择Boost.Log官方文档)
如上框架简图所示,Boost.Log 主要由日志源,全局库,sink组成等组成。
- 应用程序(左侧)通过一个或多个logger实例发送日志消息。
- 应用程序也可以出现在左侧,那就是一个日志的显示实例了。
- 一个日志记录的数据中会包括许多属性,属性基本上是一个函数,它的返回值就是属性值。有三种类型的属性集:全局的,特定线程的,特定源的。
– 全局属性集中的属性被连接到所有日志对象上。
– 线程属性集中的属性会连接到把它注册到属性集时的那个线程。
– 源属性集由初始化日志的源来维护的,它会连接到一个特定的源上。
当一个源初始化日志对象的时候,它会从上述的三个属性集的所有属性中得到属性值。如果发生冲突,则依据优先级顺序进行覆盖, 原则为:源属性集>线程属性集>全局属性集。 - 当组合属性值的时候,logging core来决定一个属性是否要被送到sink中,即过滤。共有两层:先全局过滤,用来快速的过滤掉那些不需要的日志记录,然后就是sink指定的过滤了。每个sink有单独的过滤器,该过滤器允许将一个日志记录定向到一个指定的sink。
- 当一条日志记录至少通过了一个sink,接下来该日志消息将被格式化,格式化完成的日志消息和属性值一起被送到接收它们的sink中。
- 图中Sink被分为前端和后端两部分是为了抽象sink的通用功能,例如过滤和线程同步。前端由日志库提供,用户不大可能再去实现它,后端在日志库的外面,用来实现对日志记录的处理,如写文件,发送到网络等。Boost.Log库提供了大部分常用的后端Sink。
因此,根据上述说明,要将日志放进后端Sink(File/Socket/