版权所有 © 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
运算符正常工作。