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日志并进行多维度分析。
相关文章
|
1月前
|
XML 安全 Java
【日志框架整合】Slf4j、Log4j、Log4j2、Logback配置模板
本文介绍了Java日志框架的基本概念和使用方法,重点讨论了SLF4J、Log4j、Logback和Log4j2之间的关系及其性能对比。SLF4J作为一个日志抽象层,允许开发者使用统一的日志接口,而Log4j、Logback和Log4j2则是具体的日志实现框架。Log4j2在性能上优于Logback,推荐在新项目中使用。文章还详细说明了如何在Spring Boot项目中配置Log4j2和Logback,以及如何使用Lombok简化日志记录。最后,提供了一些日志配置的最佳实践,包括滚动日志、统一日志格式和提高日志性能的方法。
346 30
【日志框架整合】Slf4j、Log4j、Log4j2、Logback配置模板
|
2月前
|
Rust 前端开发 JavaScript
Tauri 开发实践 — Tauri 日志记录功能开发
本文介绍了如何为 Tauri 应用配置日志记录。Tauri 是一个利用 Web 技术构建桌面应用的框架。文章详细说明了如何在 Rust 和 JavaScript 代码中设置和集成日志记录,并控制日志输出。通过添加 `log` crate 和 Tauri 日志插件,可以轻松实现多平台日志记录,包括控制台输出、Webview 控制台和日志文件。文章还展示了如何调整日志级别以优化输出内容。配置完成后,日志记录功能将显著提升开发体验和程序稳定性。
125 1
Tauri 开发实践 — Tauri 日志记录功能开发
|
2月前
|
XML JSON Java
Logback 与 log4j2 性能对比:谁才是日志框架的性能王者?
【10月更文挑战第5天】在Java开发中,日志框架是不可或缺的工具,它们帮助我们记录系统运行时的信息、警告和错误,对于开发人员来说至关重要。在众多日志框架中,Logback和log4j2以其卓越的性能和丰富的功能脱颖而出,成为开发者们的首选。本文将深入探讨Logback与log4j2在性能方面的对比,通过详细的分析和实例,帮助大家理解两者之间的性能差异,以便在实际项目中做出更明智的选择。
333 3
|
1月前
|
监控 开发者
鸿蒙5.0版开发:使用HiLog打印日志(ArkTS)
在HarmonyOS 5.0中,HiLog是系统提供的日志系统,支持DEBUG、INFO、WARN、ERROR、FATAL五种日志级别。本文介绍如何在ArkTS中使用HiLog打印日志,并提供示例代码。通过合理使用HiLog,开发者可以更好地调试和监控应用。
136 16
|
2月前
|
Java 程序员 API
Android|集成 slf4j + logback 作为日志框架
做个简单改造,统一 Android APP 和 Java 后端项目打印日志的体验。
139 1
|
2月前
|
开发框架 缓存 安全
开发日志:IIS安全配置
开发日志:IIS安全配置
开发日志:IIS安全配置
|
2月前
|
开发工具 git
git显示开发日志+WinSW——将.exe文件注册为服务的一个工具+图床PicGo+kubeconfig 多个集群配置 如何切换
git显示开发日志+WinSW——将.exe文件注册为服务的一个工具+图床PicGo+kubeconfig 多个集群配置 如何切换
42 1
|
2月前
|
Linux C语言 C++
vsCode远程执行c和c++代码并操控linux服务器完整教程
这篇文章提供了一个完整的教程,介绍如何在Visual Studio Code中配置和使用插件来远程执行C和C++代码,并操控Linux服务器,包括安装VSCode、安装插件、配置插件、配置编译工具、升级glibc和编写代码进行调试的步骤。
388 0
vsCode远程执行c和c++代码并操控linux服务器完整教程
|
2月前
|
SQL XML 监控
SpringBoot框架日志详解
本文详细介绍了日志系统的重要性及其在不同环境下的配置方法。日志用于记录系统运行时的问题,确保服务的可靠性。文章解释了各种日志级别(如 info、warn、error 等)的作用,并介绍了常用的日志框架如 SLF4J 和 Logback。此外,还说明了如何在 SpringBoot 中配置日志输出路径及日志级别,包括控制台输出与文件输出的具体设置方法。通过这些配置,开发者能够更好地管理和调试应用程序。
|
2月前
|
存储 监控 NoSQL
Redis的实现二: c、c++的网络通信编程技术,让服务器处理多个client
本文讨论了在C/C++中实现服务器处理多个客户端的技术,重点介绍了事件循环和非阻塞IO的概念,以及如何在Linux上使用epoll来高效地监控和管理多个文件描述符。
38 0