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

第 1 章 Boost.Log v2 - Boost C++ 函数库
Next

第 1 章 Boost.Log v2

Andrey Semashev

根据 Boost 软件许可证版本 1.0 发布。(请参阅随附文件 LICENSE_1_0.txt 或在 https://boost.ac.cn/LICENSE_1_0.txt 复制)。

目录

介绍
动机
如何阅读文档
定义
安装与兼容性
支持的编译器和平台
配置和构建库
设计概述
教程
简单的日志记录
带过滤器的简单日志记录
设置日志接收器
创建日志记录器并写入日志
向日志添加更多信息:属性
日志记录格式化
过滤器的回顾
宽字符日志记录
详细功能描述
核心功能
日志源
Sink 前端
Sink 后端
Lambda 表达式
属性
实用工具
扩展库
编写自己的日志接收器
编写自己的源
编写自定义的 attribute
扩展库设置支持
基本原理和常见问题解答
为什么使用字符串字面量作为作用域名称?
为什么作用域属性不会覆盖现有属性?
为什么多线程应用程序中的日志记录是弱序的?
为什么通过流操纵器设置的属性不参与过滤?
为什么不使用延迟流?
为什么不使用像log4j那样的日志记录器层次结构?为什么没有Boost.Log4j?等等。
Boost.Log 支持进程 fork 吗?
Boost.Log 支持在进程初始化和终止时进行日志记录吗?
为什么使用文件接收器时,我的应用程序在进程终止时崩溃?
为什么我的应用程序链接 Boost.Log 时失败?关于库命名空间的争论是什么?
为什么 MSVC 2010 链接库时失败,并出现 LNK1123 错误:转换为 COFF 时失败:文件无效或已损坏?
如何在库中使用 Boost.Log?
参考
顶层头文件
核心组件
属性
表达式
日志源
接收器(Sinks)
实用工具
其他库支持层
更新日志
未来版本的 TODO
致谢

如今,应用程序的规模迅速增长,变得复杂且难以测试和调试。应用程序大部分时间都在远程站点运行,这使得开发人员几乎没有机会监控它们的执行情况,也难以在出现问题时找出失败的原因。此外,即使是本地调试也可能变得困难,如果应用程序的行为严重依赖于异步的外部事件,例如设备反馈或其他进程活动。

这时,日志记录就能派上用场。应用程序将所有关于其执行的关键信息存储到日志中,当出现问题时,这些信息可以用于分析程序行为并进行必要的修正。日志记录还有其他非常有用的应用,例如收集统计信息和突出显示事件(即指示某种情况的发生或应用程序遇到某些问题)。对于许多实际的工业应用来说,这些任务已被证明至关重要。

本库旨在让应用程序开发者的日志记录工作变得更加轻松。它提供了广泛的开箱即用工具,以及用于扩展本库的公共接口。本库的主要目标是:

  • 简单性。一个简短的代码示例应该足以让您了解本库并准备好使用其基本功能。
  • 可扩展性。用户应该能够扩展本库的功能,以便收集信息并将其存储到日志中。
  • 性能。本库对用户应用程序的性能影响应尽可能小。

本文档面向本库的新老用户。但是,用户应熟悉常用的 Boost 组件,例如 shared_ptrmake_shared(参见 Boost.SmartPtr)和 functionBoost.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;

请注意,大多数示例后面都链接到一个完整的可编译代码样本,其中包含所有必需的包含文件和辅助代码(如果需要,已从文档中删除以节省篇幅)。相关包含文件也列在各章节的开头。

这里是文档中将广泛使用的某些术语的定义。

日志记录

从用户应用程序收集的一条信息集合,是将被放入日志的候选。在简单的情况下,日志记录在被日志库处理后将表示为日志文件中的一行文本。

Attribute

“属性”是用于专门化日志记录的元信息。在 Boost.Log 中,属性由具有特定接口的函数对象表示,当调用这些对象时,它们会返回实际的属性值。一些属性的例子是返回当前时钟时间的函数、返回单调递增的日志记录计数器的函数等。

属性值

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

(属性)值访问

一种处理属性值的方式。这种方法涉及一个函数对象(访问者),它被应用于属性值。访问者应该知道属性值的存储类型才能处理它。

(属性)值提取

一种处理属性值的方式,当调用者尝试获取存储值的引用时。调用者应该知道属性值的存储类型才能提取它。

日志源

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

日志接收器

从用户应用程序收集所有日志记录后,将所有日志记录馈送到目标。接收器定义了日志记录的存储或处理地点和方式。

日志过滤器

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

日志格式化器

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

日志核心

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

i18n

国际化。处理宽字符的能力。

TLS

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

RTTI

运行时类型信息。这是 C++ 语言支持的数据结构,对于 dynamic_casttypeid 运算符能够正常工作是必需的。


Next