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 的派生类,它会在新的线程中异步输出日志记录,从而不会阻塞主线程的执行。

相关实践学习
日志服务之使用Nginx模式采集日志
本文介绍如何通过日志服务控制台创建Nginx模式的Logtail配置快速采集Nginx日志并进行多维度分析。
相关文章
|
5天前
|
存储 编译器 C语言
c++的学习之路:5、类和对象(1)
c++的学习之路:5、类和对象(1)
19 0
|
5天前
|
C++
c++的学习之路:7、类和对象(3)
c++的学习之路:7、类和对象(3)
19 0
|
4天前
|
设计模式 Java C++
【C++高阶(八)】单例模式&特殊类的设计
【C++高阶(八)】单例模式&特殊类的设计
|
4天前
|
编译器 C++
【C++基础(八)】类和对象(下)--初始化列表,友元,匿名对象
【C++基础(八)】类和对象(下)--初始化列表,友元,匿名对象
|
8天前
|
存储 安全 C语言
【C++】string类
【C++】string类
|
1月前
|
Ubuntu JavaScript 关系型数据库
在阿里云Ubuntu 20.04服务器中搭建一个 Ghost 博客
在阿里云Ubuntu 20.04服务器上部署Ghost博客的步骤包括创建新用户、安装Nginx、MySQL和Node.js 18.x。首先,通过`adduser`命令创建非root用户,然后安装Nginx和MySQL。接着,设置Node.js环境,下载Nodesource GPG密钥并安装Node.js 18.x。之后,使用`npm`安装Ghost-CLI,创建Ghost安装目录并进行安装。配置过程中需提供博客URL、数据库连接信息等。最后,测试访问前台首页和后台管理页面。确保DNS设置正确,并根据提示完成Ghost博客的配置。
在阿里云Ubuntu 20.04服务器中搭建一个 Ghost 博客
|
1月前
|
存储 弹性计算 数据可视化
要将ECS中的文件直接传输到阿里云网盘与相册(
【2月更文挑战第31天】要将ECS中的文件直接传输到阿里云网盘与相册(
420 4
|
1月前
|
SQL 弹性计算 安全
购买阿里云活动内云服务器之后设置密码、安全组、增加带宽、挂载云盘教程
当我们通过阿里云的活动购买完云服务器之后,并不是立马就能使用了,还需要我们设置云服务器密码,配置安全组等基本操作之后才能使用,有的用户还需要购买并挂载数据盘到云服务器上,很多新手用户由于是初次使用阿里云服务器,因此并不知道这些设置的操作流程,下面给大家介绍下这些设置的具体操作流程。
购买阿里云活动内云服务器之后设置密码、安全组、增加带宽、挂载云盘教程
|
22天前
|
弹性计算
阿里云ECS使用体验
在申请高校学生免费体验阿里云ECS云服务器后的一些使用体验和感受。
|
1月前
|
弹性计算
阿里云3M带宽云服务器并发多大?阿里云3M带宽云服务器测评参考
在探讨云服务器3M带宽能支持多大并发这一问题时,我们首先要明白一个关键点:并发量并非仅由带宽决定,还与网站本身的大小密切相关。一般来说,一个优化良好的普通网站页面大小可能只有几K,为便于计算,我们可以暂且假定每个页面大小为50K。
822 1

热门文章

最新文章