Boost C++ 库

...世界上最受尊敬和精心设计的 C++ 库项目之一。 Herb SutterAndrei Alexandrescu, C++ 编码标准

Next

第 1 章。Boost.Log v2

Andrey Semashev

根据 Boost 软件许可 1.0 版分发。(请参阅随附文件 LICENSE_1_0.txt 或复制于 https://boost.ac.cn/LICENSE_1_0.txt)。

目录

简介
动机
如何阅读文档
定义
安装和兼容性
支持的编译器和平台
配置和构建库
设计概述
教程
简单的日志记录
带有过滤器的简单日志记录
设置接收器
创建记录器和写入日志
向日志添加更多信息:属性
日志记录格式化
重新审视过滤
宽字符日志记录
详细功能描述
核心设施
日志源
接收器前端
接收器后端
Lambda 表达式
属性
实用工具
扩展库
编写自己的接收器
编写自己的源
编写自己的属性
扩展库设置支持
原理和常见问题解答
为什么使用字符串字面量作为作用域名称?
为什么作用域属性不覆盖现有属性?
为什么日志记录在多线程应用程序中是弱排序的?
为什么使用流操作符设置的属性不参与过滤?
为什么不使用惰性流?
为什么不使用像 log4j 这样的记录器层次结构?为什么不使用 Boost.Log4j?等等。
Boost.Log 是否支持进程派生?
Boost.Log 是否支持在进程初始化和终止时进行日志记录?
为什么当使用文件接收器时,我的应用程序在进程终止时崩溃?
为什么我的应用程序无法链接到 Boost.Log?关于库命名空间是怎么回事?
为什么 MSVC 2010 无法链接库,并出现错误 LNK1123:转换为 COFF 时失败:文件无效或已损坏?
如何在库中使用 Boost.Log?
参考
顶层头文件
核心组件
属性
表达式
日志源
接收器
实用工具
其他库支持层
更新日志
未来版本中的 TODO
致谢

如今,应用程序发展迅速,变得复杂且难以测试和调试。大多数时候,应用程序在远程站点上运行,一旦发生故障,开发人员几乎没有机会监视它们的执行并找出故障原因。此外,如果应用程序的行为严重依赖于异步的副作用事件(例如设备反馈或另一个进程活动),即使是本地调试也可能变得有问题。

这就是日志记录可以提供帮助的地方。应用程序将所有有关其执行的基本信息存储到日志中,当出现问题时,可以使用此信息来分析程序行为并进行必要的更正。日志记录还有其他非常有用的应用,例如收集统计信息和突出显示事件(即,指示发生了某些情况或应用程序遇到了一些问题)。这些任务已被证明对许多现实世界的工业应用程序至关重要。

该库旨在使应用程序开发人员的日志记录更加轻松。它提供了广泛的开箱即用工具以及用于扩展库的公共接口。该库的主要目标是

  • 简洁性。一个小示例代码片段应该足以让您了解该库,并准备好使用其基本功能。
  • 可扩展性。用户应该能够扩展库的功能,以收集信息并将其存储到日志中。
  • 性能。该库应该尽可能减少对用户应用程序的性能影响。

该文档面向新用户和经验丰富的库用户。但是,用户应该熟悉常用的 Boost 组件,例如 shared_ptrmake_shared(请参阅 Boost.SmartPtr)和 function (Boost.Function)。文档的某些部分会根据需要引用其他 Boost 库。

如果这是您第一次使用该库,建议您阅读设计概述部分,以初步了解该库的功能和体系结构。安装教程部分将有助于您开始尝试使用该库。本教程通过示例代码片段概述了库的功能。一些教程步骤以两种形式呈现:简单形式和高级形式。简单形式通常描述最常见和最简单的方法来完成任务,建议新用户阅读。高级形式通常提供一种扩展的方法来完成同一件事,但带有深入的解释和执行一些额外自定义的功能。这种形式可能对更有经验的用户有所帮助,如果简单方法不能满足您的需求,通常应该阅读这种形式。

除了本教程外,还有一个详细功能描述章节。这部分描述了该库提供的教程未涵盖的其他工具。本章最好按具体情况阅读。

最后,但并非最不重要的是,有一个参考部分,其中给出了库组件接口的正式描述。

为了使本文档中的代码片段保持简单,假设定义了以下命名空间别名

namespace logging = boost::log;
namespace sinks = boost::log::sinks;
namespace src = boost::log::sources;
namespace expr = boost::log::expressions;
namespace attrs = boost::log::attributes;
namespace keywords = boost::log::keywords;

请注意,大多数示例后面都链接到一个完整的可编译代码示例,其中包含所有必要的包含和辅助代码(如果有),这些代码为了简洁起见从文档中删除。相关包含也列在各节的开头。

以下是一些将在整个文档中广泛使用的术语的定义

日志记录

从用户的应用程序收集的单个信息捆绑包,该信息捆绑包是要放入日志中的候选者。在简单的情况下,日志记录在被日志记录库处理后将表示为日志文件中的一行文本。

属性

“属性”是一条元信息,可用于专门化日志记录。在 Boost.Log 中,属性由具有特定接口的函数对象表示,这些函数对象在调用时返回实际的属性值。属性的一些示例是返回当前时钟时间的函数、返回单调递增的日志记录计数器的函数等。

属性值

属性值是从属性获取的实际数据。此数据附加到特定的日志记录并由库处理。值可以具有不同的类型(整数、字符串和更复杂的类型,包括用户定义的类型)。属性值的一些示例:当前时间戳值、文件名、行号、当前作用域名称等。属性值被封装在一个类型擦除包装器中,因此属性的实际类型在接口中不可见。值的实际(擦除的)类型有时称为存储类型。

(属性)值访问

一种处理属性值的方法。这种方法涉及一个函数对象(访问器),该访问器应用于属性值。访问器应知道属性值的存储类型才能对其进行处理。

(属性)值提取

一种在调用者尝试获取对存储值的引用时处理属性值的方法。调用者应知道属性值的存储类型才能提取它。

日志源

用户的应用程序将日志记录放入的入口点。在简单的情况下,它是一个对象(记录器),维护一组属性,这些属性将在用户请求时用于形成日志记录。但是,当然可以创建一个源,该源会在某些副作用事件上发出日志记录(例如,通过拦截和解析另一个应用程序的控制台输出)。

日志接收器

一个目标,所有日志记录从用户的应用程序收集后都会被发送到该目标。接收器定义日志记录将存储或处理的位置和方式。

日志过滤器

一个谓词,它接收一个日志记录,并判断该记录是否应传递以进行进一步处理或丢弃。该谓词通常根据附加到记录的属性值做出决定。

日志格式化器

一个函数对象,它从日志记录生成最终的文本输出。一些接收器(例如二进制日志记录接收器)可能不需要它,尽管几乎所有基于文本的接收器都会使用格式化器来构成其输出。

日志记录核心

一个全局实体,维护接收器列表,并将过滤器应用于日志源生成的记录。在用户的应用程序中,它主要在配置日志记录库时使用。应用程序中只有一个日志记录核心的实例。

i18n

国际化。操作宽字符的能力。

TLS

线程局部存储。拥有一个变量的概念,该变量对于尝试访问它的每个线程都具有独立的值。

RTTI

运行时类型信息。这是 C++ 语言支持数据结构,用于使 dynamic_casttypeid 运算符正常工作。


Next