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

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

  • 一、日志的重要性
    • 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.xdnf.cn/news/147371.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

在python爬虫中xpath方式提取lxml.etree._ElementUnicodeResult转化为字符串str类型

简单提取网页中的数据时发现的 当通过xpath方式提取出需要的数据的text文本后想要转为字符串,但出现lxml.etree._ElementUnicodeResult的数据类型不能序列化,在网上查找到很多说是编码问题Unicode编码然后解码什么的;有些是(导入的xml库而不…

LeetCode讲解篇之1343. 大小为 K 且平均值大于等于阈值的子数组数目

文章目录 题目描述题解思路题解代码 题目描述 题解思路 题目让我们求长度为k的子数组并且该子数组的平均值大于threshold,对于这题,我们可以考虑维护一个长度为k的窗口,窗口不断向右滑动,遍历所有长度为k的子数组,我们…

基于Spring Boot的Java免税商品优选商城设计

第一章 绪论 1.1 课题开发的背景 从古至今,通过书本获取知识信息的方式完全被互联网络信息化,但是免税商品优选购物商城,对于购物商城工作来说,仍然是一项非常重要的工作。尤其是免税商品优选购物商城,传统人工记录模式…

JS | 详解浏览器存储机制cookies、sessionStorage和localStorage的区别

F12在浏览器查看 一、HTML4的本地存储——cookie 浏览器的缓存机制提供了可以将用户数据存储在客户端上的方式,可以利用cookie,session等跟服务端进行数据交互。 cookie和session cookie 和 session都是用来跟踪浏览器用户身份的会话方式。 区别&a…

如何使用 Python 的 sqlite3 模块操作 SQLite 数据库?

如何使用 Python 的 sqlite3 模块操作 SQLite 数据库? SQLite 是一种轻量级的数据库,它不需要服务器,数据库被存储在一个文件中,非常适合嵌入式系统或桌面应用程序。Python 标准库中包含了一个名为 sqlite3 的模块,可…

vue-入门速通

setup是最早的生命周期,在vue2里边的data域可以使用this调用setup里面的数据,但是在setup里边不能使用thisvue项目的可执行文件是index,另外运行前端需要npm run vue的三个模块内需要三个不同的结构,里边放置js代码,注…

【Go开发】Go语言基本语法入门:数据类型与方法定义

文章目录 环境准备一、引言二、Var关键字三、数据类型1. 整型符号表示值的范围 2. 浮点型精度范围性能 3. 布尔型4. 字符串 三、变量声明1. 指定变量类型2. 自动推导类型3. 批量声明 四、方法定义五、总结 环境准备 开发环境:MacOS Go版本:go version g…

计算机毕业设计之:基于微信小程序的校园流浪猫收养系统(源码+文档+讲解)

博主介绍: ✌我是阿龙,一名专注于Java技术领域的程序员,全网拥有10W粉丝。作为CSDN特邀作者、博客专家、新星计划导师,我在计算机毕业设计开发方面积累了丰富的经验。同时,我也是掘金、华为云、阿里云、InfoQ等平台…

「漏洞复现」灵当CRM marketing/index.php SQL注入漏洞

0x01 免责声明 请勿利用文章内的相关技术从事非法测试,由于传播、利用此文所提供的信息而造成的任何直接或者间接的后果及损失,均由使用者本人负责,作者不为此承担任何责任。工具来自网络,安全性自测,如有侵权请联系删…

如何使用ssm实现社区流浪动物救助领养系统的设计与开发+vue

TOC ssm666社区流浪动物救助领养系统的设计与开发vue 第一章 课题背景及研究内容 1.1 课题背景 信息数据从传统到当代,是一直在变革当中,突如其来的互联网让传统的信息管理看到了革命性的曙光,因为传统信息管理从时效性,还是安…

Python编码系列—Python策略模式:灵活应对变化的算法策略

🌟🌟 欢迎来到我的技术小筑,一个专为技术探索者打造的交流空间。在这里,我们不仅分享代码的智慧,还探讨技术的深度与广度。无论您是资深开发者还是技术新手,这里都有一片属于您的天空。让我们在知识的海洋中…

微软AI核电计划

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗?订阅我们的简报,深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同,从行业内部的深度分析和实用指南中受益。不要错过这个机会,成为AI领…

Django学习实战篇六(适合略有基础的新手小白学习)(从0开发项目)

前言: 上一章中,我们完成了页面样式的配置,让之前简陋的页面变得漂亮了些。 整理一下目前已经完成的系统,从界面上看,已经完成了以下页面: 首页分类列表页标签列表页口博文详情页 这离我们的需求还有些距离&#xff0…

Python | Leetcode Python题解之第423题从英文中重建数字

题目: 题解: class Solution:def originalDigits(self, s: str) -> str:c Counter(s)cnt [0] * 10cnt[0] c["z"]cnt[2] c["w"]cnt[4] c["u"]cnt[6] c["x"]cnt[8] c["g"]cnt[3] c["h…

【完整梳理验证】企业微信第三方应用接入全流程java版

企业微信第三方应用接入全流程java版 1. 概念与流程1.1 概念1、企业内部应用2、`第三方应用`3、代开发自建应用1.2 流程1.2.1 全局流程1.2.2 应用配置1.2.3 数据流程2. 核心文档2.1 理解第三方应用开发流程和概念2.1.1 应用开发阶段2.1.2 应用推广阶段2.1.3 基本流程1)前期应用…

C++ | Leetcode C++题解之第421题数组中两个数的最大异或值

题目: 题解: struct Trie {// 左子树指向表示 0 的子节点Trie* left nullptr;// 右子树指向表示 1 的子节点Trie* right nullptr;Trie() {} };class Solution { private:// 字典树的根节点Trie* root new Trie();// 最高位的二进制位编号为 30static…

leetcode第十题:正则表达式匹配

给你一个字符串 s 和一个字符规律 p,请你来实现一个支持 . 和 * 的正则表达式匹配。 . 匹配任意单个字符* 匹配零个或多个前面的那一个元素 所谓匹配,是要涵盖 整个 字符串 s 的,而不是部分字符串。 示例 1: 输入:s…

TMS320F28335的定时器中断实验

TTMS320F28335 的 CPU 定时器有 3 个且均为 32 位,分别是 Timer0、Timer1、Timer2, 其中 Timer2 是为操作系统 DSP/BIOS 保留的,当未移植操作系统时,可用来做普 通的定时器。这三个定时器的中断信号分别为 TINT0,TINT1,TINT2,分别对应中断向量于 INT1,INT13,INT14。 1 …

使用 NCache 将 Java 微服务扩展到极致性能

微服务已成为软件开发领域的一种变革性架构方法,提供了从整体结构到更加模块化和可扩展的系统的范式转变。微服务的核心是将复杂的应用程序分解为更小的、可独立部署的服务,这些服务可以无缝通信,从而提高敏捷性、灵活性和易维护性。这种分散…

动态规划day38|322. 零钱兑换(背包满了吗?最小值怎么表示?)、279. 完全平方数、139. 单词拆分、多重背包要点、背包问题大总结

动态规划day38|322. 零钱兑换(背包满了吗?最小值怎么表示?)、279. 完全平方数、139. 单词拆分、多重背包要点、背包问题大总结 322. 零钱兑换279. 完全平方数139. 单词拆分多重背包要点背包问题大总结 322. 零钱兑换 给你一个整数…