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

相关实践学习
【涂鸦即艺术】基于云应用开发平台CAP部署AI实时生图绘板
【涂鸦即艺术】基于云应用开发平台CAP部署AI实时生图绘板
相关文章
|
2月前
|
Prometheus 监控 Cloud Native
基于docker搭建监控系统&日志收集
Prometheus 是一款由 SoundCloud 开发的开源监控报警系统及时序数据库(TSDB),支持多维数据模型和灵活查询语言,适用于大规模集群监控。它通过 HTTP 拉取数据,支持服务发现、多种图表展示(如 Grafana),并可结合 Loki 实现日志聚合。本文介绍其架构、部署及与 Docker 集成的监控方案。
342 122
基于docker搭建监控系统&日志收集
WGLOG日志管理系统是怎么收集日志的
WGLOG通过部署Agent客户端采集日志,Agent持续收集指定日志文件并上报Server,Server负责展示与分析。Agent与Server需保持相同版本。官网下载地址:www.wgstart.com
|
5月前
|
监控 API 开发工具
HarmonyOS Next的HiLog日志系统完全指南:从入门到精通
本文深入解析HarmonyOS Next的HiLog日志系统,涵盖日志级别、核心API、隐私保护与高级回调功能,助你从入门到精通掌握这一重要开发工具。
349 1
|
2月前
|
存储 缓存 监控
用 C++ 红黑树给公司电脑监控软件的日志快速排序的方法
本文介绍基于C++红黑树算法实现公司监控电脑软件的日志高效管理,利用其自平衡特性提升日志排序、检索与动态更新效率,并结合实际场景提出优化方向,增强系统性能与稳定性。
113 4
|
2月前
|
Ubuntu
在Ubuntu系统上设置syslog日志轮替与大小限制
请注意,在修改任何系统级别配置之前,请务必备份相应得原始档案并理解每项变更可能带来得影响。
267 2
|
XML 安全 Java
【日志框架整合】Slf4j、Log4j、Log4j2、Logback配置模板
本文介绍了Java日志框架的基本概念和使用方法,重点讨论了SLF4J、Log4j、Logback和Log4j2之间的关系及其性能对比。SLF4J作为一个日志抽象层,允许开发者使用统一的日志接口,而Log4j、Logback和Log4j2则是具体的日志实现框架。Log4j2在性能上优于Logback,推荐在新项目中使用。文章还详细说明了如何在Spring Boot项目中配置Log4j2和Logback,以及如何使用Lombok简化日志记录。最后,提供了一些日志配置的最佳实践,包括滚动日志、统一日志格式和提高日志性能的方法。
3488 31
【日志框架整合】Slf4j、Log4j、Log4j2、Logback配置模板
|
4月前
|
存储
WGLOG日志管理系统可以采集网络设备的日志吗
WGLOG日志审计系统提供开放接口,支持外部获取日志内容后发送至该接口,实现日志的存储与分析。详情请访问:https://www.wgstart.com/wglog/docs9.html
|
9月前
|
存储 前端开发 数据可视化
Grafana Loki,轻量级日志系统
本文介绍了基于Grafana、Loki和Alloy构建的轻量级日志系统。Loki是一个由Grafana Labs开发的日志聚合系统,具备高可用性和多租户支持,专注于日志而非指标,通过标签索引而非内容索引实现高效存储。Alloy则是用于收集和转发日志至Loki的强大工具。文章详细描述了系统的架构、组件及其工作流程,并提供了快速搭建指南,包括准备步骤、部署命令及验证方法。此外,还展示了如何使用Grafana查看日志,以及一些基本的LogQL查询示例。最后,作者探讨了Loki架构的独特之处,提出了“巨型单体模块化”的概念,即一个应用既可单体部署也可分布式部署,整体协同实现全部功能。
3284 70
Grafana Loki,轻量级日志系统
|
7月前
|
人工智能 Python
083_类_对象_成员方法_method_函数_function_isinstance
本内容主要讲解Python中的数据类型与面向对象基础。回顾了变量类型(如字符串`str`和整型`int`)及其相互转换,探讨了加法在不同类型中的表现。通过超市商品分类比喻,引出“类型”概念,并深入解析类(class)与对象(object)的关系,例如具体橘子是橘子类的实例。还介绍了`isinstance`函数判断类型、`type`与`help`探索类型属性,以及`str`和`int`的不同方法。最终总结类是抽象类型,对象是其实例,不同类型的对象有独特运算和方法,为后续学习埋下伏笔。
154 8
083_类_对象_成员方法_method_函数_function_isinstance
|
8月前
|
存储 消息中间件 缓存
MiniMax GenAI 可观测性分析 :基于阿里云 SelectDB 构建 PB 级别日志系统
基于阿里云SelectDB,MiniMax构建了覆盖国内及海外业务的日志可观测中台,总体数据规模超过数PB,日均新增日志写入量达数百TB。系统在P95分位查询场景下的响应时间小于3秒,峰值时刻实现了超过10GB/s的读写吞吐。通过存算分离、高压缩比算法和单副本热缓存等技术手段,MiniMax在优化性能的同时显著降低了建设成本,计算资源用量降低40%,热数据存储用量降低50%,为未来业务的高速发展和技术演进奠定了坚实基础。
355 1
MiniMax GenAI 可观测性分析 :基于阿里云 SelectDB 构建 PB 级别日志系统

热门文章

最新文章