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)。

目录

简介
动机
如何阅读文档
定义
安装和兼容性
支持的编译器和平台
配置和构建库
设计概述
教程
简单的日志记录
带过滤器的简单日志记录
设置 sink
创建 logger 和写入日志
向日志添加更多信息:属性
日志记录格式化
重新审视过滤
宽字符日志记录
详细功能描述
核心设施
日志源
Sink 前端
Sink 后端
Lambda 表达式
属性
实用工具
扩展库
编写您自己的 sink
编写您自己的源
编写您自己的属性
扩展库设置支持
原理和常见问题解答
为什么使用字符串字面量作为作用域名称?
为什么作用域属性不覆盖现有属性?
为什么日志记录在多线程应用程序中是弱排序的?
为什么使用流操纵器设置的属性不参与过滤?
为什么不使用延迟流式传输?
为什么不使用像 log4j 这样的 logger 层级结构?为什么不是 Boost.Log4j?等等。
Boost.Log 是否支持进程 fork?
Boost.Log 是否支持在进程初始化和终止时进行日志记录?
为什么在使用文件 sink 时我的应用程序在进程终止时崩溃?
为什么我的应用程序无法链接 Boost.Log?库命名空间是怎么回事?
为什么 MSVC 2010 无法链接库,并出现错误 LNK1123:转换为 COFF 期间失败:文件无效或损坏?
如何在库中使用 Boost.Log?
参考
顶层头文件
核心组件
属性
表达式
日志源
Sink
实用工具
其他库支持层
更新日志
未来版本中的 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 中,属性由具有特定接口的函数对象表示,这些函数对象在被调用时返回实际的属性值。属性的一些示例是返回当前时钟时间的函数、返回单调递增的日志记录计数器的函数等。

属性值

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

(属性)值访问

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

(属性)值提取

当调用者尝试获取对存储值的引用时,处理属性值的一种方式。调用者应了解属性值的存储类型,以便能够提取它。

日志源

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

日志 sink

一个目标,从用户的应用程序收集所有日志记录后,将它们馈送到该目标。sink 定义了日志记录的存储位置和存储方式或处理方式。

日志过滤器

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

日志格式化器

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

日志记录核心

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

i18n

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

TLS

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

RTTI

运行时类型信息。这是 dynamic_casttypeid 运算符正常运行所需的 C++ 语言支持数据结构。


Next