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

本文涉及的产品
日志服务 SLS,月写入数据量 50GB 1个月
简介: 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 的派生类,它会在新的线程中异步输出日志记录,从而不会阻塞主线程的执行。

相关实践学习
日志服务之使用Nginx模式采集日志
本文介绍如何通过日志服务控制台创建Nginx模式的Logtail配置快速采集Nginx日志并进行多维度分析。
相关文章
|
23天前
|
监控 Java Linux
Linux系统之安装Ward服务器监控工具
【10月更文挑战第17天】Linux系统之安装Ward服务器监控工具
48 5
Linux系统之安装Ward服务器监控工具
|
4天前
|
存储 编译器 C++
【c++】类和对象(中)(构造函数、析构函数、拷贝构造、赋值重载)
本文深入探讨了C++类的默认成员函数,包括构造函数、析构函数、拷贝构造函数和赋值重载。构造函数用于对象的初始化,析构函数用于对象销毁时的资源清理,拷贝构造函数用于对象的拷贝,赋值重载用于已存在对象的赋值。文章详细介绍了每个函数的特点、使用方法及注意事项,并提供了代码示例。这些默认成员函数确保了资源的正确管理和对象状态的维护。
21 4
|
5天前
|
存储 编译器 Linux
【c++】类和对象(上)(类的定义格式、访问限定符、类域、类的实例化、对象的内存大小、this指针)
本文介绍了C++中的类和对象,包括类的概念、定义格式、访问限定符、类域、对象的创建及内存大小、以及this指针。通过示例代码详细解释了类的定义、成员函数和成员变量的作用,以及如何使用访问限定符控制成员的访问权限。此外,还讨论了对象的内存分配规则和this指针的使用场景,帮助读者深入理解面向对象编程的核心概念。
18 4
WK
|
6天前
|
开发框架 开发工具 C++
C++跨平台框架Qt
Qt是一个功能强大的C++跨平台应用程序开发框架,支持Windows、macOS、Linux、Android和iOS等操作系统。它提供了250多个C++类,涵盖GUI设计、数据库操作、网络编程等功能。Qt的核心特点是跨平台性、丰富的类库、信号与槽机制,以及良好的文档和社区支持。Qt Creator是其官方IDE,提供了一整套开发工具,方便创建、编译、调试和运行应用程序。Qt适用于桌面、嵌入式和移动应用开发。
WK
25 5
|
18天前
|
存储 安全 关系型数据库
Linux系统在服务器领域的应用与优势###
本文深入探讨了Linux操作系统在服务器领域的广泛应用及其显著优势。通过分析其开源性、安全性、稳定性和高效性,揭示了为何Linux成为众多企业和开发者的首选服务器操作系统。文章还列举了Linux在服务器管理、性能优化和社区支持等方面的具体优势,为读者提供了全面而深入的理解。 ###
|
21天前
|
NoSQL Linux PHP
|
28天前
|
存储 编译器 对象存储
【C++打怪之路Lv5】-- 类和对象(下)
【C++打怪之路Lv5】-- 类和对象(下)
25 4
|
28天前
|
存储 安全 C++
【C++打怪之路Lv8】-- string类
【C++打怪之路Lv8】-- string类
19 1
WK
|
13天前
|
C++ 开发者 iOS开发
C++跨平台框架
C++跨平台框架使开发者能够编写一次代码,在多个操作系统和硬件平台上运行,提高开发效率和软件可扩展性。常见的框架包括Qt、wxWidgets、SDL、JUCE等,它们各自具有丰富的功能和特点,适用于不同的应用场景。选择框架时需考虑目标平台、功能需求、学习曲线和社区支持等因素。
WK
23 0
|
28天前
|
Apache 数据中心 Windows
将网站迁移到阿里云Windows系统云服务器,访问该站点提示连接被拒绝,如何处理?
将网站迁移到阿里云Windows系统云服务器,访问该站点提示连接被拒绝,如何处理?

热门文章

最新文章