C++基于多设计模式下的同步异步日志系统day2

📟作者主页:慢热的陕西人

🌴专栏链接:C++基于多设计模式下的同步&异步日志系统

📣欢迎各位大佬👍点赞🔥关注🚓收藏,🍉留言

主要内容实现了日志代码设计的实用类设计,日志等级设计,日志消息类设计。

在这里插入图片描述

文章目录

  • C++基于多设计模式下的同步&异步日志系统day2
    • 1.日志系统框架设计
      • 1.1模块划分
      • 1.2模块关系图
    • 2.代码设计
      • 2.1实用类设计
      • 2.2日志等级类设计
      • 2.3日志消息类的设计

C++基于多设计模式下的同步&异步日志系统day2

1.日志系统框架设计

本项⽬实现的是⼀个多⽇志器⽇志系统,主要实现的功能是让程序员能够轻松的将程序运⾏⽇志信息落地到指定的位置,且⽀持同步与异步两种⽅式的⽇志落地⽅式。项⽬的框架设计将项⽬分为以下⼏个模块来实现。

1.1模块划分

  • ⽇志等级模块:对输出⽇志的等级进⾏划分,以便于控制⽇志的输出,并提供等级枚举转字符串功能。

    1. OFF:关闭
    2. DEBUG:调试,调试时的关键信息输出
    3. INFO:提示,普通的提示性日志信息
    4. WARN:警告,不影响运行,但是需要注意一下的日志
    5. ERROR:错误,程序运行出现错误的日志
    6. FATAL:致命,一般是代码异常导致程序无法继续推进的运行的日志
  • 日志消息模块:中间存储日志输出所需的个各项要素信息

    1. 时间:描述本条日志的输出时间
    2. 线程ID:描述本条日志是哪个线程输出的
    3. 日志等级:描述本条日志的等级
    4. 日志数据:本条日志的有效载荷数据
    5. 日志文件名:描述本条日志在哪个源码文件中输出的
    6. 日志行号:描述本条日志在源码文件的哪一行输出的
  • ⽇志消息格式化模块:设置⽇志输出格式,并提供对⽇志消息进⾏格式化功能

    1. 系统的默认⽇志输出格式:%d{%H:%M:%S}%T[%t]%T[%p]%T[%c]%T%f:%l%T%m%n
    2. ->13:26:32 [2343223321] [FATAL] [root] main.c:76套接字创建失败\n
    3. %d{%H:%M:%S}:表⽰⽇期时间,花括号中的内容表⽰⽇期时间的格式
    4. %T:表⽰制表符缩进
    5. %t:表⽰线程ID
    6. %p:表⽰⽇志级别
    7. %c:表⽰⽇志器名称,不同的开发组可以创建⾃⼰的⽇志器进⾏⽇志输出,⼩组之间互不影响
    8. %f:表⽰⽇志输出时的源代码⽂件名
    9. %l:表⽰⽇志输出时的源代码⾏号
    10. %m:表⽰给与的⽇志有效载荷数据
    11. %n:表⽰换⾏
    12. 设计思想:设计不同的⼦类,不同的⼦类从⽇志消息中取出不同的数据进⾏处理
  • ⽇志消息落地模块:决定了⽇志的落地⽅向,可以是标准输出,也可以是⽇志⽂件,也可以滚动⽂
    件输出…

    1. 标准输出:表⽰将⽇志进⾏标准输出的打印
    2. ⽇志⽂件输出:表⽰将⽇志写⼊指定的⽂件末尾
    3. 滚动⽂件输出:当前以⽂件⼤⼩进⾏控制,当⼀个⽇志⽂件⼤⼩达到指定⼤⼩,则切换下⼀个⽂件进⾏输出
    4. 后期,也可以扩展远程⽇志输出,创建客⼾端,将⽇志消息发送给远程的⽇志分析服务器
    5. 设计思想:设计不同的⼦类,不同的⼦类控制不同的⽇志落地⽅向
  • ⽇志器模块:

    1. 此模块是对以上⼏个模块的整合模块,⽤⼾通过⽇志器进⾏⽇志的输出,有效降低⽤⼾的使⽤难度
    2. 包含有:⽇志消息落地模块对象,⽇志消息格式化模块对象,⽇志输出等级
  • ⽇志器管理模块:

    1. 为了降低项⽬开发的⽇志耦合,不同的项⽬组可以有⾃⼰的⽇志器来控制输出格式以及落地⽅向,因此本项⽬是⼀个多⽇志器的⽇志系统
    2. 管理模块就是对创建的所有⽇志器进⾏统⼀管理。并提供⼀个默认⽇志器提供标准输出的⽇志输出
  • 异步线程模块:

    1. 实现对⽇志的异步输出功能,⽤⼾只需要将输出⽇志任务放⼊任务池,异步线程负责⽇志的落地输出功能,以此提供更加⾼效的⾮阻塞⽇志输出

1.2模块关系图

image-20240301151659398

2.代码设计

2.1实用类设计

提前完成⼀些零碎的功能接⼝,以便于项⽬中会⽤到

  • 获取系统时间
  • 判断⽂件是否存在
  • 获取⽂件的所在⽬录路径
  • 创建⽬录
/*实用工具类的实现:1.获取系统时间2.判断文件是否存在3.获取文件所在路径4.创建目录
*/#include<iostream>
#include<ctime>
#include<unistd.h>
#include<sys/stat.h>namespace xupt
{namespace util{class Date{public:static size_t GetTime(){return (size_t)time(nullptr);}    };class File{public:static bool exist(const std::string &pathname){//确保平台移植性,我们不是用这个接口//return (access(pathname.c_str(), F_OK) == 0); //F_OK,文件存在且权限允许,返回0,struct st;if(stat(pathname.c_str(), &st) < 0){return false;}return true;}static std::string path(const std::string &pathname){size_t pos = pathname.find_last_of("/\\"); /*从路径字符串的后面开始寻找第一个/或者\ */if(pos == std::string.npos) return "."; //如果没有找到,那么证明这个文件就在当前的目录return pathname.substr(0, pos + 1); //输出包含最后一个/的位置的字符串}static void CreateDirectory(const std::string &pathname){size_t pos = 0, idx = 0;while(idx < pathname.size()){pos = pathname.find_first_of("/\\"); //寻找第一个/或者\if(pos == std::string.npos){mkdir(pathname, 0777); //如果没有分隔符,那么就直接创建,并且设置权限为0777}std::string parent_dir = pathname.substr(0, idx + pos + 1); //截取包含从开始到/的父目录if(exist(parent_dir) == true) { idx = pos + 1; continue; } //如果当前的目录存在了,那么就跳过去找下一个mkdir(parent_dir, 0777);idx = pos + 1;}}};}
}

2.2日志等级类设计

①日志等级总共分为7个等级,分别为:

  • UNKNOW表示未知错误
  • DRBUG进⾏debug时候打印⽇志的等级
  • INFO打印⼀些⽤⼾提⽰信息
  • WARN打印警告信息
  • ERROR打印错误信息
  • FATAL打印致命信息-导致程序崩溃的信息
  • OFF关闭所有日志输出

每一个项目中都会设置一个默认的日志输出等级,只有输出的日志等级大于等于默认限制等级的时候才可以进行输出

②提供一个接口,将对应等级的枚举,转换为一个对应的字符串。

/*1.定义枚举类,枚举出日志等级2.提供转换接口:将枚举转换为对应字符串
*/
#ifndef __M_LEVEL_H__
#define __M_LEVEL_H__namespace xupt
{class LogLevel{public:enum class value{UNKOWN = 0,DEBUG,INFO,WARN,ERROR,FATAL,OFF};static const char* toString(LogLevel::value level){switch (level){case LogLevel::value::DEBUG: return "DEBUG";case LogLevel::value::INFO: return "INFO";case LogLevel::value::WARN: return "WARN";case LogLevel::value::ERROR: return "ERROR";case LogLevel::value::FATAL: return "FATAL";case LogLevel::value::OFF: return "OFF";}return "UNKOWN";}};
}#endif

2.3日志消息类的设计

⽇志消息类主要是封装⼀条完整的⽇志消息所需的内容,其中包括⽇志等级、对应的loggername
印⽇志源⽂件的位置信息(包括⽂件名和⾏号)、线程ID时间戳信息具体的⽇志信息等内容

定义日志消息类,进行日志中间信息的存储:1.日志的输出时间   用于过滤日志输出时间2.日志等级        用于进行日志过滤分析3.源文件名称 4.源代码行号      用于定位出现错误的代码位置5.线程ID          用于过滤出错的线程6.日志主体消息7.日志器名称  (当前支持多日志器的同时使用)
*/
#ifndef __M_MESSAGE_H__
#define __M_MESSAGE_H__#include"util.hpp"
#include"level.hpp"
#include<iostream>
#include<string>
#include<thread>namespace xupt
{struct LogMsg{size_t _ctime; //日志产生的时间LogLevel::value _level; //日志等级size_t _line;  //行号std::thread::id _tid; //线程idstd::string _file; //文件名std::string _logger; //日志器名称std::string _payload; //有效消息处理//对应的构造函数LogMsg(LogLevel::value level,size_t line,std::string file,std::string logger,std::string msg):_ctime(util::Date::now()),_level(level),_line(line),_tid(std::this_thread::get_id()),_file(file),_logger(logger),_payload(msg){}};}#endif

到这本篇博客的内容就到此结束了。
如果觉得本篇博客内容对你有所帮助的话,可以点赞,收藏,顺便关注一下!
如果文章内容有错误,欢迎在评论区指正

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/267168.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

前端学习第三天-css基础

1. CSS简介 从HTML被发明开始&#xff0c;样式就以各种形式存在。不同的浏览器结合它们各自的样式语言为用户提供页面效果的控制。最初的HTML只包含很少的显示属性。 随着HTML的成长&#xff0c;为了满足页面设计者的要求&#xff0c;HTML添加了很多显示功能。但是随着这些功能…

nginx出现 “414 request-uri too large”

nginx出现 “414 request-uri too large” 1.修改传参方式 POST 2.字段能变成后端获取就自己获取&#xff0c;不用前端传 3.修改nginx配置&#xff0c;添加client_header_buffer_size 512k;large_client_header_buffers 4 512k;配置

机器学习 -- 梯度下降算法加深

梯度下降算法 在机器学习中&#xff0c;梯度下降算法常用于最小化代价函数&#xff08;或损失函数&#xff09;&#xff0c;以此来优化模型的参数。代价函数衡量的是模型预测值与实际值之间的差异。通过最小化这个函数&#xff0c;我们可以找到模型预测最准确的参数。 代价函…

qt 基于百度API的人脸识别

百度云官网&#xff1a;点击跳转 一、创建应用 跳转进去&#xff0c;可以看到以下界面&#xff1a; 点击红色圈内的“去创建”&#xff0c;创建自己的项目。可以看到以下界面&#xff1a; 输入“应用名称”&#xff0c;并勾选“人脸对比”&#xff0c;还要到页面的最后输入“应…

WPF 滑动条样式

效果图&#xff1a; 浅色&#xff1a; 深色&#xff1a; 滑动条部分代码&#xff1a; <Style x:Key"RepeatButtonTransparent" TargetType"{x:Type RepeatButton}"><Setter Property"OverridesDefaultStyle" Value"true"/&g…

MariaDB MaxScale实现mysql8读写分离

目录 1.MaxScale 是干什么的&#xff1f; 2.MaxScale 实验环境 3.实现数据库主从复制 4.创建用户 1) 创建监控用户 2) 创建路由用户 5.docker 安装MaxScale 6.配置maxscale 使用 maxctrl list servers 命令查看运行状态 查看注册服务 使用 maxctrl list listeners Read-…

k8s单机部署zookeeper

&#xff08;作者&#xff1a;陈玓玏&#xff09; 拉取镜像&#xff1a;docker pull zookeeper&#xff1b;编辑yaml&#xff1a; apiVersion: v1 kind: Service metadata:name: zookeeperlabels:app: zookeeper spec:ports:- name: clientport: 2181protocol: TCPtargetP…

H.266参考软件VTM各版本的性能差异

VTM&#xff08;VVC Test Model&#xff09;&#xff0c;是H.266视频编码标准的参考软件&#xff0c;即是VVC spec.的一种参考实现&#xff0c;代码里包括了H.266的软件编码器和软件解码器实现&#xff0c;代码地址如下&#xff1a; https://vcgit.hhi.fraunhofer.de/jvet/VVCS…

S1---FPGA硬件板级原理图实战导学

视频链接 FPGA板级实战导学01_哔哩哔哩_bilibili FPGA硬件板级原理图实战导学 【硬件电路设计的方法和技巧-哔哩哔哩】硬件电路设计的方法和技巧01_哔哩哔哩_bilibili&#xff08;40min&#xff09; 【高速板级硬件电路设计-哔哩哔哩】 高速板级硬件电路设计1_哔哩哔哩_bil…

外包干了3个月,技术倒退明显...

先说情况&#xff0c;大专毕业&#xff0c;18年通过校招进入湖南某软件公司&#xff0c;干了接近6年的功能测试&#xff0c;今年年初&#xff0c;感觉自己不能够在这样下去了&#xff0c;长时间呆在一个舒适的环境会让一个人堕落!而我已经在一个企业干了四年的功能测试&#xf…

【软考】UML中的图之通信图

目录 1. 说明2. 图示3. 特性4. 例题4.1 例题1 1. 说明 1.通信图强调收发消息的对象的结构组织2.早期版本叫做协作图3.通信图强调参加交互的对象和组织4.首先将参加交互的对象作为图的顶点&#xff0c;然后把连接这些对象的链表示为图的弧&#xff0c;最后用对象发送和接收的消…

【C++ map和set】

文章目录 map和set序列式容器和关联式容器键值对setset的主要操作 mapmap主要操作 multiset和multimap map和set 序列式容器和关联式容器 之前我们接触的vector,list,deque等&#xff0c;这些容器统称为序列式容器&#xff0c;其底层为线性序列的的数据结构&#xff0c;里面存…

ChatGPT学习第四周

&#x1f4d6; 学习目标 ChatGPT实践操作 通过实际操作和练习&#xff0c;加深对ChatGPT功能的理解。 项目&#xff1a;创建一个ChatGPT应用案例 设计一个基于ChatGPT的小项目&#xff0c;将理论应用于实践。 ✍️ 学习活动 学习资料 《万字干货&#xff01;ChatGPT 从零完…

鸿蒙Harmony应用开发—ArkTS声明式开发(通用属性:位置设置)

设置组件的对齐方式、布局方向和显示位置。 说明&#xff1a; 从API Version 7开始支持。后续版本如有新增内容&#xff0c;则采用上角标单独标记该内容的起始版本。 align align(value: Alignment) 设置容器元素绘制区域内的子元素的对齐方式。 卡片能力&#xff1a; 从API…

nvm安装及使用

后面补充安装&#xff0c;因为我自己几年前就装好了。。。 看是否正确安装nvm 查看是否在nvm正确安装多个node版本 切换版本 管理员权限运行cmd 指定安装版本 npm i node-sass^4.14.1查看npm数据源 npm config get registry鸿蒙的华为源。。。 https://repo.huaweiclo…

报错问题解决django.db.utils.OperationalError: (1049, “Unknown database ‘ mxshop‘“)

开发环境&#xff1a;ubuntu22.04 pycharm 功能&#xff1a;django连接使用mysql数据库&#xff0c;各项配置看似正常 报错&#xff1a; django.db.utils.OperationalError: (1049, "Unknown database mxshop") 分析检查原因&#xff1a; Setting的配置文件内&…

oracle11安装及使用

安装oracle11 官网下载地址 Oracle Database 11g Release 2 for Microsoft Windows (x64) 官网下载慢可访问我的资源 也可以网盘获取 链接&#xff1a;https://pan.baidu.com/s/1RDrGkqDA7tfKRnpJXUBMDw 提取码&#xff1a;z3na 上传安装包到服务器 在指定目录下创建文件…

机器学习笔记 YOLOv9模型相关论文简读

一、YOLOv9简述 自 2015 年 Yolov1 推出以来,已经出现了多个版本。 基于Darknet的YOLOv2、YOLOv3和YOLOv4 YOLOv5 YOLOv8 基于 Ultralytics。 SCALED-YOLOv4 使用 Pytorch 而不是 Darknet。 YOLOR是YOLOv4的改进。 YOLOX是YOLOv3的改进。 YOLOv6专注于工业应用。 YOLOv7 来自 …

Python中re模块的使用

正则表达式是一种强大的工具&#xff0c;用于处理字符串的匹配、搜索和替换操作。在Python中&#xff0c;我们可以使用内置的re模块来执行各种正则表达式操作。 1 基本用法 re.match(pattern, string): 从字符串的开头匹配一个模式。返回match对象或None。re.search(pattern,…

matplotlib矩阵和图像的可视化表示

文章目录 伪彩图等高线colorbar matplotlib教程&#xff1a;初步&#x1f4c8;子图绘制&#x1f4c8;坐标投影&#x1f4c8;刻度设置&#x1f4c8;共享坐标轴&#x1f4c8;内容填充&#x1f4c8;文字和字体 伪彩图 【plt】中提供了三种矩阵可视化函数&#xff0c;分别是imsho…