... 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
运算符正常工作。