C++服务器框架开发9——日志系统LogFormatter_4/各个类的关系梳理/std::function/std::get

简介: C++服务器框架开发9——日志系统LogFormatter_4/各个类的关系梳理/std::function/std::get

在 GCC 中,attribute是一个用于指定变量、函数或结构体中某些属性的关键字。通过使用attribute,开发者可以告诉编译器关于代码中某些隐含意义的信息,从而让编译器对代码进行更准确和更有效的优化。具体来说,attribute的用法与语法如下:

语法:

attribute ((attribute-list))

其中,attribute-list是一个逗号分隔的属性列表,每个属性都是一个键值对,键表示属性名称,值是可选的。

常用属性:

aligned:表示指定变量或结构体字段的起始地址必须按照指定的对齐方式进行存放,比如__attribute__((aligned(4)))就可以将变量或结构体字段以4字节对齐的方式存储。

deprecated:表示指定的函数或变量已经被弃用,这个属性可以让编译器在编译时给出警告信息。

packed:用于指定结构体或联合体所占用尽可能少的内存。

section:表示指定的变量或函数存储在特定的段(section)中,可以将一些特定的变量或函数放到内存优化的段中。

unused:表示指定的函数或变量未被使用,这个属性可以让编译器在编译时给出警告信息。

总之,通过使用attribute可以指定变量、函数或结构体中某些属性,从而让编译器进行更准确和更有效的优化,同时也可以通过指定弃用、未使用等属性来帮助开发者检查程序中潜在的问题。
C++服务器框架开发9——日志系统LogFormatter_4/各个类的关系梳理/std::function/std::get

在 C++ 11 中,std::function 是一个具有通用多态调用功能的类模板,用于存储、复制和调用任意可调用目标——函数、Lambda 表达式、函数指针等。std::function 的常见用法是作为回调函数的参数,在服务器框架中,可以使用 std::function 实现回调函数类型的封装。

std::get 是一个 C++ 17 提供的标准库函数,用于从一个 std::tuple 对象中获取指定位置的元素,并返回一个引用。在服务器框架中,常用的场景是将多个参数打包进一个 std::tuple 对象传递,然后使用 std::get 获取其中的元素进行处理。

在日志系统中,LogFormatter 类封装了一个日志输出格式,并提供了将日志记录格式化为字符串的功能。LogFormatter 类通常包含若干个占位符,用于表示不同类型的日志记录,比如日志级别、时间、线程 ID、线程名称等。

LogEvent 类封装了一条日志记录,包含了日志记录的级别、时间戳、线程 ID、线程名称、文件名、行号、协程 ID、日志内容等信息。LogEvent 类实现了一个 operator<<() 函数,用于将 LogEvent 对象输出到输出流中。

Logger 类是日志系统的核心类,它负责将一条日志记录按照指定的方式输出到不同目的地,比如文件、网络、控制台等。Logger 类通常包含若干个 Appender 类对象,它们负责实际的日志输出逻辑。

Appender 类是 Logger 类的一种组成部分,用于将一条日志记录输出到指定的目的地。Appender 类通常包含一个 LogFormatter 对象,用于将一条日志记录格式化为字符串,并按照指定的方式输出到目的地。

AsyncLogger 类是 Logger 类的派生类,它与 Logger 类的区别在于,AsyncLogger 类会在新的线程中异步输出日志记录,从而不会影响主线程的执行性能。

综上所述,服务器框架中各个类之间的关系如下图所示:

                                                        +------------+
                                                        |   Logger   |
                                                        +------------+
                                                              |
                                                              |
                                                              v

+------------+ +-----------------------------------------------+
| LogFormatter|<-----------+ |
+------------+ | +----------+ |
| | Appender| |
| +----------+ |
| | |
| | |
| v |
| +------------------------------------------+ |
| | | |
| | v |
| | +----------------+ +---------------+
| | | LogEvent | | AsyncLogger |
| | +----------------+ +---------------+
| |
| |
| |
v v
+-------------+
| std::function|
+-------------+
|
|
v
+-------------+
| std::get |
+-------------+

在上图中,箭头表示类之间的依赖关系,从箭头指向的类向箭头所指的类提供服务或依赖。例如,LogFormatter 类依赖于 std::function 和 std::get,通过它们来实现占位符的替换和参数的获取;Appender 类依赖于 LogFormatter,用于将格式化后的日志记录输出到指定的目的地;Logger 类依赖于 Appender,通过多个 Appender 对象来实现多路日志输出;AsyncLogger 类则是 Logger 的派生类,它会在新的线程中异步输出日志记录,从而不会阻塞主线程的执行。

相关实践学习
通过日志服务实现云资源OSS的安全审计
本实验介绍如何通过日志服务实现云资源OSS的安全审计。
相关文章
|
11月前
|
存储 监控 算法
员工屏幕监控系统之 C++ 图像差分算法
在现代企业管理中,员工屏幕监控系统至关重要。本文探讨了其中常用的图像差分算法,该算法通过比较相邻两帧图像的像素差异,检测屏幕内容变化,如应用程序切换等。文中提供了C++实现代码,并介绍了其在实时监控、异常行为检测和数据压缩等方面的应用,展示了其实现简单、效率高的特点。
371 15
|
存储 对象存储 C++
C++ 中 std::array<int, array_size> 与 std::vector<int> 的深入对比
本文深入对比了 C++ 标准库中的 `std::array` 和 `std::vector`,从内存管理、性能、功能特性、使用场景等方面详细分析了两者的差异。`std::array` 适合固定大小的数据和高性能需求,而 `std::vector` 则提供了动态调整大小的灵活性,适用于数据量不确定或需要频繁操作的场景。选择合适的容器可以提高代码的效率和可靠性。
|
存储 算法 程序员
C++ 11新特性之function
C++ 11新特性之function
415 9
|
Python
Flask学习笔记(二):基于Flask框架上传图片到服务器端并原名保存
关于如何使用Flask框架上传图片到服务器端并以其原名保存的教程。
567 1
|
Python
Flask学习笔记(三):基于Flask框架上传特征值(相关数据)到服务器端并保存为txt文件
这篇博客文章是关于如何使用Flask框架上传特征值数据到服务器端,并将其保存为txt文件的教程。
207 0
Flask学习笔记(三):基于Flask框架上传特征值(相关数据)到服务器端并保存为txt文件
|
Web App开发 JavaScript 前端开发
使用Node.js和Express框架构建Web服务器
使用Node.js和Express框架构建Web服务器
|
分布式计算 Hadoop
Hadoop-27 ZooKeeper集群 集群配置启动 3台云服务器 myid集群 zoo.cfg多节点配置 分布式协调框架 Leader Follower Observer
Hadoop-27 ZooKeeper集群 集群配置启动 3台云服务器 myid集群 zoo.cfg多节点配置 分布式协调框架 Leader Follower Observer
283 1
|
存储 监控 NoSQL
Redis的实现二: c、c++的网络通信编程技术,让服务器处理多个client
本文讨论了在C/C++中实现服务器处理多个客户端的技术,重点介绍了事件循环和非阻塞IO的概念,以及如何在Linux上使用epoll来高效地监控和管理多个文件描述符。
218 1
|
Linux C语言 C++
vsCode远程执行c和c++代码并操控linux服务器完整教程
这篇文章提供了一个完整的教程,介绍如何在Visual Studio Code中配置和使用插件来远程执行C和C++代码,并操控Linux服务器,包括安装VSCode、安装插件、配置插件、配置编译工具、升级glibc和编写代码进行调试的步骤。
3061 0
vsCode远程执行c和c++代码并操控linux服务器完整教程
|
C++
【C++案例】一个项目掌握C++基础-通讯录管理系统
这篇文章通过一个通讯录管理系统的C++项目案例,详细介绍了如何使用C++实现添加、显示、删除、查找、修改和清空联系人等功能。
332 3

热门文章

最新文章