日志系统第一弹:日志系统介绍

devtools/2025/1/19 15:02:24/

日志系统第一弹:日志系统介绍

  • 一、日志的重要性
    • 1.什么是日志?
    • 2.排查BUG
    • 3.监控系统
    • 4.监控程序性能
  • 二、日志系统技术
    • 1.同步写日志
    • 2.异步写日志
    • 3.日志文件轮换方案
      • 1.日志分类方式
      • 2.日志轮换方案
  • 三、项目设计
    • 1.目标
    • 2.设计
      • 1.日志消息模块
      • 2.日志格式化模块
      • 3.日志消息落地模块
      • 4.日志器模块
      • 5.日志器管理模块
      • 6.异步日志器模块
  • 四、模块关系图
    • 1.模块设计思路
    • 2.模块关系图

这是我日志系统项目的基础版本,目的是先实现一个基础版本的日志系统,后续在对其进行扩展,丰富更多功能

一、日志的重要性

1.什么是日志?

在软件开发当中,日志是一种记录系统运行时信息的方式。
日志当中记录了程序的运行状态、错误信息、警告和调试信息等,通常被记录到文件当中,当然也可以记录到数据库当中,或者发送到远程服务器当中

正因为日志记录了运行状态、(错误、警告、调试)信息等,因此日志在软件开发当中便具有了以下意义:

2.排查BUG

因为日志记录了(错误、警告、调试信息),因此当代码出现BUG时,可以通过查看日志了解程序在执行过程中的各个步骤和状态,帮助快速定位和分析问题

尤其是因为有些BUG很难复现,所以通过日志就可以精准捕获任何BUG,无需再去复现了

3.监控系统

因为日志记录了运行状态,因此日志可以用来监控系统事件(系统启动、关闭、重启和故障)
这可以帮助管理员更好的了解系统健康状况,及时发现和解决潜在的问题

4.监控程序性能

因为日志记录了运行状态,因此日志可以用来监控应用程序的运行状况和性能,可以记录关键指标:(响应时间,数据库查询次数,内存使用情况。。。)
通过分析这些日志数据,开发人员可以及时发现潜在的性能问题,并采取措施来改进应用程序的性能

二、日志系统技术

日志的落地方向,主要分为三种:

  1. printf / cout 打印到控制台
  2. 将日志写入文件
  3. 将日志写入数据库 -> 为了方便查询和分析日志

在执行角度又分为:

  1. 同步写日志
  2. 异步写日志

1.同步写日志

当输出日志时,必须等待日志输出任务结束之后,才能继续下面的业务逻辑

每次输出日志都要调用一次write,磁盘IO较为频繁,而IO操作本身就慢,所以有可能会延迟业务线程对业务逻辑的处理
在这里插入图片描述
这是一个业务线程串行化打印日志的过程

2.异步写日志

同步写日志有一个很大的缺陷,就是它让业务线程打印日志串行化了,在日志成功输出之前,业务线程无法处理接下来的业务逻辑

因此就有了异步写日志:
业务线程要打印日志时,只需要将日志放入日志缓冲区即可
会专门有日志线程从缓冲区当中拿日志并进行输出

这就是一个生产消费模型,业务线程就是生产者,日志线程就是消费者
在这里插入图片描述
一般来说,日志线程的数量都不会多,因为线程还是要多分配给业务模块,毕竟线程不是越多越好

3.日志文件轮换方案

因为服务器是24小时永远不停止服务的,所以日志肯定不可能全都往一个文件当中堆,否则查询和分析日志时就非常麻烦了

1.日志分类方式

  1. 按日志等级进行分类
  2. 按时间进行分类(年月日时分秒)
  3. 按模块进行分类(系统日志、应用程序日志、安全日志)
  4. 按错误类型进行分类(系统错误、应用程序错误、配置错误)

分类方式还有很多,具体问题具体分析,分类方式很灵活

2.日志轮换方案

一种类型的日志也不能无限制的往一个文件当中堆,照样会提高查询和分析日志的复杂程度

因此,日志需要轮换:

  1. 按文件大小进行轮换(到达指定的文件大小之后进行轮换)
  2. 按时间进行轮换(时,分,秒)

因此日志落地当中:向文件当中落地又可以细分为:

  1. 向固定文件落地
  2. 向滚动文件(轮换文件)落地

三、项目设计

1.目标

我们要实现一个线程安全的,支持同步,异步,多落地方式的日志系统

2.设计

1.日志消息模块

日志系统,首先要有日志消息结构体
这个模块就是定义日志消息结构体的模块

注意:日志往往需要包含以下字段:

  1. 时间(年月日时分秒)
  2. 日志等级
  3. 文件名和行号
  4. 线程ID
  5. 消息主体

因为这些字段太多,记录日志时,有时我们不太需要线程ID,有时可能只想记录消息主体

因此为了让日志的记录方式更加灵活,我们参照printf的格式化占位符设计思想,设计出了日志格式化模块

2.日志格式化模块

日志格式化模块主要负责:

  1. 约定各种格式化占位符
  2. 允许用户传入自定义格式化字符串,在内部解析
  3. 把用户传入的消息主体格式化为日志消息

能够把消息转为日志之后,下面我们就要考虑如何将日志落地到不同的位置:

  1. 标准输出
  2. 文件
  3. 数据库
  4. 远程服务器

因此,我们就需要日志落地模块

3.日志消息落地模块

日志落地模块主要负责将格式化之后的日志消息输出到指定的落地方向

关键是支持多落地方向:

  1. 标准输出
  2. 指定文件
  3. 滚动文件(按大小进行滚动)
    而且还支持用户灵活扩展

能够将日志落地到指定方向之后,因为一条日志可以落地到不同位置,而且这三个模块需要整合一下

因此就有了下面这个整合模块:日志器模块

4.日志器模块

日志器模块主要负责对:
日志消息模块、日志格式化模块、日志消息落地模块进行整合
对外提供便捷,好用的接口来完成消息的输出

注意:

  1. 一个日志器支持多个落地方向
  2. 一个日志器只支持一种日志格式
  3. 日志器是日志打印的基本单位
  4. 日志器分为同步日志器和异步日志器,
    分别负责同步日志记录和异步日志记录

日志格式不同,便需要不同的日志,因此日志器会存在多份,所以需要一个日志器管理类

5.日志器管理模块

所谓管理,在这里就是增删查改

6.异步日志器模块

对于同步日志器来说,上面那些模块就足够了
而对于异步日志器来说,还差一个交易场所和消费者

因此,这个模块除了基本的日志器模块之外,需要一个缓存(交易场所)模块和一个异步工作器模块(消费者线程)

实现一个打印日志的生产消费模型

四、模块关系图

1.模块设计思路

在这里插入图片描述

2.模块关系图

在这里插入图片描述

以上就是日志系统第一弹:日志系统介绍的全部内容哦


http://www.ppmy.cn/devtools/115324.html

相关文章

政务安全运营核心能力模块

采集能力 提供收集云安全、网络安全、数据安全、应用安全、终端安全、密码安全日志的能力,形成安全数据的大集中,为支撑全面风险感知和安全管控提供数据基础。 威胁分析能力 通过威胁情报、威胁分析模型等,基于对大量历史数据持续进化不断…

探索轻量级语言模型 GPT-4O-mini 的无限可能

随着人工智能技术的日益发展,语言模型正逐渐成为人们日常生活和工作中不可或缺的一部分。其中,GPT-4O-mini 作为一个轻量级大模型,以其强大的功能和易用性吸引了众多关注。本文将带您了解 GPT-4O-mini 的出色表现、应用场景以及如何免费使用这…

CICD简单描述笔记

个人笔记内容 你如何理解持续集成和持续部署(CI/CD)? 持续集成(Continuous Integration, CI) 和持续部署(Continuous Deployment, CD) 是现代软件开发实践中的关键环节,它们旨在提…

Maven笔记(二):进阶使用

Maven笔记(二)-进阶使用 一、Maven分模块开发 分模块开发对项目的扩展性强,同时方便其他项目引入相同的功能。 将原始模块按照功能拆分成若干个子模块,方便模块间的相互调用,接口共享(类似Jar包一样之间引用、复用)…

梧桐数据库(WuTongDB):Volcano/Cascades 优化器框架简介

Volcano/Cascades 是现代关系数据库系统中使用的两种重要的查询优化器框架,它们用于将高层 SQL 查询转换为高效的执行计划。它们采用了一种基于规则的方式来探索各种可能的查询执行计划,目的是选择一个代价最小的计划。以下是对这两种框架的详细讲解&…

常见项目场景题2(多次输错密码禁止登录,分布式下多线程抢夺资源)

多次输错密码后如何禁止一定时间内用户再次登录 通常使用 IP 地址为单位来进行限制,而非具体的用户。这样可以减少误伤其他用户的可能性。 (一个非法用户可能会拿他人的账号不断尝试登录) 同时,以 IP 地址为单位进行限制还可以避…

【STM32】STM32G431RBT6芯片引脚默认功能是什么?

1. PA9、PA10 STM32G431RBT6芯片的PA9和PA10引脚具有串口通信功能,其中PA9用作发送(TX),PA10用作接收(RX)。 在STM32G431RBT6中,GPIO端口A(PA0~PA15)是多功能的输入输出…

uni-app安装插件

1.通过插件市场安装https://ext.dcloud.net.cn 打开HBuilderX编辑器。 点击菜单栏中的“工具”->“插件安装”。 这里会看到已安装插件和安装新插件两个选项卡,点击安装新插件, 能看到一些核心插件,如果所需要的插件在核心插件里面有&…