版权所有 © 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 中,属性由具有特定接口的函数对象表示,这些函数对象在被调用时返回实际的属性值。属性的一些示例是返回当前时钟时间的函数、返回单调递增的日志记录计数器的函数等。
属性值是从属性获取的实际数据。此数据附加到特定的日志记录并由库处理。值可以具有不同的类型(整数、字符串和更复杂的类型,包括用户定义的类型)。属性值的一些示例:当前时间戳值、文件名、行号、当前作用域名称等。属性值被封装在类型擦除包装器中,因此属性的实际类型在接口中不可见。值的实际(擦除的)类型有时称为存储类型。
处理属性值的一种方式。这种方法涉及一个函数对象(访问器),该对象应用于属性值。访问器应了解属性值的存储类型才能对其进行处理。
当调用者尝试获取对存储值的引用时,处理属性值的一种方式。调用者应了解属性值的存储类型,以便能够提取它。
用户的应用程序将日志记录放入的入口点。在简单的情况下,它是一个对象(logger),该对象维护一组属性,这些属性将用于在用户请求时形成日志记录。但是,当然可以创建一个源,该源会在某些副作用事件上发出日志记录(例如,通过拦截和解析另一个应用程序的控制台输出)。
一个目标,从用户的应用程序收集所有日志记录后,将它们馈送到该目标。sink 定义了日志记录的存储位置和存储方式或处理方式。
一个谓词,它接受日志记录并告知是否应将此记录传递以进行进一步处理或丢弃。谓词通常根据附加到记录的属性值做出决定。
一个函数对象,它从日志记录生成最终的文本输出。某些 sink,例如二进制日志记录 sink,可能不需要它,尽管几乎所有基于文本的 sink 都将使用格式化器来组成其输出。
一个全局实体,它维护 sink 列表并将过滤器应用于日志源生成的记录。在用户的应用程序中,它主要在配置日志记录库时使用。应用程序中只有一个日志记录核心实例。
国际化。操作宽字符的能力。
线程局部存储。一种概念,即拥有一个变量,该变量对于尝试访问它的每个线程都具有独立的值。
运行时类型信息。这是 dynamic_cast
和 typeid
运算符正常运行所需的 C++ 语言支持数据结构。