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

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

第一章 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)
实用工具
其他库支持层
更新日志
未来版本中的待办事项
致谢

如今,应用程序发展迅速,变得复杂且难以测试和调试。大多数时候,应用程序运行在远程站点,开发者很难监控其执行情况,一旦出现问题也难以找出失败的原因。此外,即使是本地调试也可能变得困难,因为应用程序的行为高度依赖于异步的外部事件,例如设备反馈或其他进程的活动。

这就是日志记录可以发挥作用的地方。应用程序将其所有关键执行信息存储到日志中,当出现问题时,这些信息可以用来分析程序行为并进行必要的修正。日志记录还有其他非常有用的应用,例如收集统计信息和高亮事件(即指示某些情况的发生,或应用程序正在经历某些问题)。这些任务对许多真实世界的工业应用已被证明至关重要。

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

  • 简洁性。一个小的代码示例应足以让开发者体会到本库的易用性,并准备好使用其基本功能。
  • 可扩展性。用户应能够扩展本库的功能,以收集和存储信息到日志中。
  • 性能。本库对用户应用程序的性能影响应尽可能小。

本文档面向新老用户。但是,用户应熟悉常用的 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