Boost C++ 库
...one of the most highly regarded and expertly designed C++ library projects in the world.
— Herb Sutter and Andrei Alexandrescu, C++ Coding Standards
版权所有 © 2007-2024 Andrey Semashev
根据 Boost 软件许可证版本 1.0 发布。(请参阅随附文件 LICENSE_1_0.txt 或在 https://boost.ac.cn/LICENSE_1_0.txt 复制)。
目录
如今,应用程序的规模迅速增长,变得复杂且难以测试和调试。应用程序大部分时间都在远程站点运行,这使得开发人员几乎没有机会监控它们的执行情况,也难以在出现问题时找出失败的原因。此外,即使是本地调试也可能变得困难,如果应用程序的行为严重依赖于异步的外部事件,例如设备反馈或其他进程活动。
这时,日志记录就能派上用场。应用程序将所有关于其执行的关键信息存储到日志中,当出现问题时,这些信息可以用于分析程序行为并进行必要的修正。日志记录还有其他非常有用的应用,例如收集统计信息和突出显示事件(即指示某种情况的发生或应用程序遇到某些问题)。对于许多实际的工业应用来说,这些任务已被证明至关重要。
本库旨在让应用程序开发者的日志记录工作变得更加轻松。它提供了广泛的开箱即用工具,以及用于扩展本库的公共接口。本库的主要目标是:
本文档面向本库的新老用户。但是,用户应熟悉常用的 Boost 组件,例如 shared_ptr、make_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 中,属性由具有特定接口的函数对象表示,当调用这些对象时,它们会返回实际的属性值。一些属性的例子是返回当前时钟时间的函数、返回单调递增的日志记录计数器的函数等。
属性值是从属性中获取的实际数据。这些数据附加到特定的日志记录并由库处理。值可以有不同的类型(整数、字符串以及更复杂的类型,包括用户定义的类型)。一些属性值的例子:当前时间戳值、文件名、行号、当前作用域名称等。属性值被封装在一个类型擦除的包装器中,因此属性的实际类型在接口中是不可见的。值的实际(擦除后的)类型有时被称为存储类型。
一种处理属性值的方式。这种方法涉及一个函数对象(访问者),它被应用于属性值。访问者应该知道属性值的存储类型才能处理它。
一种处理属性值的方式,当调用者尝试获取存储值的引用时。调用者应该知道属性值的存储类型才能提取它。
用户应用程序将日志记录放入的入口点。在简单的情况下,它是一个对象(日志记录器),它维护一组属性,在用户请求时用于形成日志记录。但是,当然也可以创建一个源,它会在某些外部事件(例如,通过拦截和解析另一个应用程序的控制台输出来)时发出日志记录。
从用户应用程序收集所有日志记录后,将所有日志记录馈送到目标。接收器定义了日志记录的存储或处理地点和方式。
一个谓词,它接受一个日志记录并告知是否应将该记录传递给进一步处理或丢弃。谓词通常基于附加到记录的属性值来做出决定。
一个函数对象,它从日志记录生成最终的文本输出。某些接收器,例如二进制日志记录接收器,可能不需要它,尽管几乎任何基于文本的接收器都会使用格式化器来组合其输出。
一个全局实体,它维护一个接收器列表,并对由日志源生成的记录应用过滤器。在用户应用程序中,它主要在配置日志库时使用。应用程序中只有一个日志核心实例。
国际化。处理宽字符的能力。
线程局部存储。一种变量概念,该变量对于尝试访问它的每个线程都有独立的值。
运行时类型信息。这是 C++ 语言支持的数据结构,对于 dynamic_cast 和 typeid 运算符能够正常工作是必需的。