[C++]——同步异步日志系统(4)

同步异步日志系统

  • 一、日志等级模块设计
  • 二、日志消息类设计

一、日志等级模块设计

  1. 定义出日志系统所包含的所有日志等级分别为:(7个等级)
  • UNKNOW=0,未知等级的日志
  • DRBUG ,调试等级的日志
  • INFO ,提示等级的日志
  • WARN ,警告等级的日志
  • ERROR ,错误等级的日志
  • FATAL ,致命错误等级的日志
  • OFF,关闭所有⽇志输出
    每一个项目中都会设置一个默认的日志输出等级,只有输出的日志等级大于等于默认限制等级的时候才可以进行输出。
  1. 提供一个接口,将对应等级进行枚举,转化为一个对应的字符串
  2. 首先需要把架子搭起来,功能先声明好。
/*
1.定义枚举类,枚举出日志等级
2.提供转换接口,将枚举转换位对应的字符串
*/
namespace logslearn{
        //等级模块
        class level{
        public:
        //定义枚举类
        enum class value{};
        //转换接口
        static const char *tostring(level::value level);
    };
}
  1. 其次在实现各个功能。
/*
1.定义枚举类,枚举出日志等级
2.提供转换接口,将枚举转换位对应的字符串
*/
namespace logslearn
{
    // 等级模块
    class loglevel
    {
    public:
        // 定义枚举类
        enum class value
        {
            UNKNOW = 0, // 未知等级的日志
            DRBUG,      // 调试等级的日志
            INFO,       // 提示等级的日志
            WARN,       // 警告等级的日志
            ERROR,      // 错误等级的日志
            FATAL,      // 致命错误等级的日志
            OFF,        // 关闭所有⽇志输出
        };
        // 转换接口
        static const char *tostring(loglevel::value level)
        {
            switch (level)
            {
            case loglevel::value::DRBUG:
                return "DRBUG";
            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 "UNKNOW";
        }
    };
}

  1. 我们每次编写完一个模块后,要对其进行单元测试,确保程序的准确性。
//测试代码
#include "util.hpp"
#include "level.hpp"
int main()
{
    //等级模块测试
    std::cout<<logslearn::loglevel::tostring(logslearn::loglevel::value::DRBUG)<<std::endl;
    std::cout<<logslearn::loglevel::tostring(logslearn::loglevel::value::INFO)<<std::endl;
    std::cout<<logslearn::loglevel::tostring(logslearn::loglevel::value::ERROR)<<std::endl;
    std::cout<<logslearn::loglevel::tostring(logslearn::loglevel::value::WARN)<<std::endl;
    std::cout<<logslearn::loglevel::tostring(logslearn::loglevel::value::FATAL)<<std::endl;
    std::cout<<logslearn::loglevel::tostring(logslearn::loglevel::value::OFF)<<std::endl;
    std::cout<<logslearn::loglevel::tostring(logslearn::loglevel::value::UNKNOW)<<std::endl;
    return 0;
}
  1. 界面展示
    make运行之后
    在这里插入图片描述

二、日志消息类设计

  1. 意义:中间存储一条日志消息所需要的各项要素
    日志的输出时间:用于过滤日志输出时间
    日志等级:用于进行日志过滤分析
    源文件名称
    源代码行号:用于定位出错的代码位置
    线程ID:用于过滤出错的线程
    日志主体消息
    日志器名称:支持多日志器的同时使用
    如:每一条日志打印,都会加上这些消息
    [2024-07-09 17:04][root][1234567][main.c:99][FATAL]: 创建套接字失…
  2. 我们在构造一条消息的时候,调用构造函数进行构造,传入各项参数,就可以完成一条消息的构造.
    对消息的各个要素进行设计,并且完成构造。
/*
1.日志的输出时间:用于过滤日志输出时间
2.日志等级:用于进行日志过滤分析
3.源文件名称
4.源代码行号:用于定位出错的代码位置
5.线程ID:用于过滤出错的线程
6.日志主体消息
7.日志器名称:支持多日志器的同时使用
*/
#include "level.hpp"
#include <iostream>
#include <string>
#include <thread>
namespace logslearn{
    //日志消息模块
    struct LogMsg
    {
        time_t _ctime;//日志产生的时间戳
        loglevel::value _level;//日志产生的等级
        size_t _line;//行号
        std::thread::id _tid;//线程id
        std::string _file;//源文件
        std::string _logger;//日志器名称
        std::string _payload;//有效消息数据
        //初始化列表
        LogMsg(loglevel::value leven,size_t line,const std::string file,const std::string logger,const std::string msg):
        _ctime(logsLearn::util::Data::now()),
        _level(leven),
        _line(line),
        _tid(std::this_thread::get_id()),
        _file(file),
        _logger(logger),
        _payload(msg)
        {}
    };
}
  1. 这里我们只是定义一个结构体,没有办法进行测试,因此我们只需要构造一个结构体并且没有编译错误就可以了
//测试代码
#include "util.hpp"
#include "level.hpp"
#include "message.hpp"
int main()
{
    //消息类模块构造
    logslearn::LogMsg(logslearn::loglevel::value::DRBUG, 123,"main.c","root","我错了");
    std::cout<<"编译没有错误"<<std::endl;
        return 0;
}

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

企业人事管理系统

1.课设要求描述 【系统描述】软件从登录界面开始&#xff0c;验证用户名与密码后&#xff0c;根据登录用户名权限的不同&#xff0c;打开软件后展示不同的功能模块。软件主要功能模块是人事管理、部门管理、备忘录、员工生日提醒、数据库的维护等。 通过简单分析后&#xf…

STM32串口工作原理

STM32的串口是相当丰富的&#xff0c;功能也很强劲。最多可提供5 路串口&#xff0c;有分数波特率发生器、支持单线光通信和半双工单线通讯、支持LIN、智能卡协议和IrDA SIRENDEC 规范(仅串口3支持)、具有DMA等。 串口最基本的设置&#xff0c;就是波特率的设置。STM32的串口使…

Nature Communications|柔性高密度、高灵敏应变传感器阵列(柔性应变传感/界面调控/电子皮肤/柔性电子)

复旦大学武利民( Limin Wu)和李卓( Zhuo Li)团队,在《Nature Communications》上发布了一篇题为“High-density, highly sensitive sensor array of spiky carbon nanospheres for strain field mapping”的论文。论文内容如下: 一、 摘要 在工程应用中,准确地映射应变…

暑假实践web前后端开发-笔记

&#xff08;主要是前端开发&#xff0c;不做后端&#xff0c;前面先介绍一个实现了前后端的项目&#xff09; 一. 安装和运行项目MoreMall 1.介绍项目MoreMall 已经实现前后端可以前后端交互&#xff0c;前端&#xff1a;client&#xff0c;后端&#xff1a;server&#xff…

轮转数组(超详细!)

前言&#xff1a; 小编在上一篇文章的时候拿过轮转数组作为例子来讲述复杂度&#xff0c;但是小编并没有给出这个题目的正确解答&#xff0c;既然读者朋友已经了解复杂度了&#xff08;不了解也没关系&#xff0c;可以看小编上一篇文章&#xff09;&#xff0c;下面&#xff0c…

【数据结构】深入理解哈希及其底层数据结构

目录 一、unordered系列关联式容器 二、底层结构 2.1 哈希的概念 2.2 哈希冲突&#xff08;哈希碰撞&#xff09; 2.3 哈希函数 2.4 哈希冲突处理 2.4.1 闭散列&#xff08;开放定址法&#xff09; 2.4.1.1 代码实现&#xff1a; 2.4.2 开散列&#xff08;链地址法&…

高职计算机网络实训室

一、高职计算机网络实训室建设的背景 如今&#xff0c;数字化发展已成为国家发展的战略方向&#xff0c;是推动社会进步和经济发展的重要动力。在这一时代背景下&#xff0c;计算机网络技术作为数字化发展的基础设施&#xff0c;其地位和作用愈发凸显。因此&#xff0c;高职院…

Python数据分析-乳腺癌诊断分析预测

一、研究背景 乳腺癌是全球女性中最常见的癌症之一&#xff0c;发病率和死亡率都处于较高水平。据世界卫生组织&#xff08;WHO&#xff09;统计&#xff0c;乳腺癌每年造成数百万女性的死亡&#xff0c;并且其发病率在许多国家呈上升趋势。乳腺癌的早期诊断对于提高患者的生存…

帕金森老人的锻炼建议

对于帕金森病老人来说&#xff0c;适当的锻炼可以帮助改善症状、增强肌肉力量、提高关节灵活性&#xff0c;并预防长期并发症。以下是一些基于最新信息的锻炼建议&#xff1a; 选择合适的运动类型&#xff1a;包括有氧运动、抗阻运动和牵伸运动。有氧运动如快走、慢跑、游泳和舞…

旅游景区度假村展示型网站如何建设渠道品牌

景区、度假村、境外旅游几乎每天的人流量都非常高&#xff0c;还包括本地附近游等&#xff0c;对景区及度假村等固定高流量场所&#xff0c;品牌和客户赋能都是需要完善的&#xff0c;尤其是信息展示方面&#xff0c;旅游客户了解前往及查看信息等。 通过雨科平台建设景区度假…

收银系统源码-视频介绍

千呼新零售2.0系统是零售行业连锁店一体化收银系统&#xff0c;包括线下收银线上商城连锁店管理ERP管理商品管理供应商管理会员营销等功能为一体&#xff0c;线上线下数据全部打通。 适用于商超、便利店、水果、生鲜、母婴、服装、零食、百货、宠物等连锁店使用。 详细介绍请…

目标检测基本标注工具-labelImg安装与使用

&#x1f349;一、安装 1.1 打开conda创建虚拟环境&#x1f388; conda create -n labelImg python3.8 -y 1.2 激活labelImg虚拟环境&#x1f388; activate labelImg1.3 安装labelImg&#x1f388; pip install -i https://pypi.tuna.tsinghua.edu.cn/simple lab…

LayoutLMv1

近年来&#xff0c;预训练技术在各种NLP任务中得到了成功的验证。尽管NLP应用程序广泛使用预训练模型&#xff0c;但它们几乎只关注文本级操作&#xff0c;而忽略了对文档图像理解至关重要的布局和样式信息。在本文中&#xff0c;我们提出了LayoutLM来联合建模文本和布局信息在…

【走出阴霾,拥抱阳光】当心情陷入抑郁,我们该如何自救?

在这个快节奏的时代&#xff0c;我们时常会感受到生活的压力和种种不如意。当心情长时间处于低落状态&#xff0c;甚至影响到日常生活时&#xff0c;我们或许已经步入了抑郁的阴影。面对这种情况&#xff0c;我们不必过于恐慌&#xff0c;更不能自暴自弃。接下来&#xff0c;就…

简单分享下利用python做测试的学习方向

做为一名转行过来的工程师&#xff0c;我想分享一下这些年来&#xff0c;我对于技术是怎样晋升的&#xff0c;我是在职&#xff0c;边上班边利用时间学习起来的&#xff0c;也听过很多业内人的分享&#xff08;简单可以总结以下几点&#xff0c;分享给大家碎片的式学习方式&…

Java小白入门到实战应用教程-开发环境搭建-JDK安装详细教程

Java小白入门到实战应用教程-JDK安装详细教程 writer:eleven 开发环境搭建 上节内容补充 在带领大家搭建开发环境前&#xff0c;先来了解一些java领域的名词。 Java根据应用领域区别可分为三个版本&#xff1a; JavaSE&#xff1a;是Java的标准版&#xff0c;提供了Java的…

Java 常用的参数校验,简化参数校验,赶紧学起来!!

Java 常用的参数校验&#xff0c;简化参数校验&#xff0c;赶紧学起来&#xff01;&#xff01;Java中的参数校验注解主要用于简化数据验证的过程&#xff0c;它们允许开发者以声明式的方式指定参数的验证规则&#xff0c;而无需在业https://mp.weixin.qq.com/s?__bizMzkzMTY0…

289个地级市-资源型城市划分数据

资源型城市&#xff1a;经济地理的独特现象与可持续发展的挑战 资源型城市是指那些以丰富的自然资源为基础&#xff0c;对国家经济和工业化进程有着重要影响的城市。这些城市在国家现代化建设中扮演着关键角色&#xff0c;其发展状况直接关系到区域经济的繁荣与社会的稳定。 资…

使用ffmpeg将一个目录下的mkv格式的视频文件转换成mp4格式

最近学剪辑&#xff0c;从BT种子下载的素材资源都是mkv格式的&#xff0c;不能直接导入到视频剪辑软件中。这种情况下需要用一些格式转换工具进行转换&#xff0c;也可以使用ffmpeg进行编辑。 ffmpeg是一个命令行工具&#xff0c;用来对本地的音频视频软件进行编辑。ffmpeg我也…

无人机之电池保养

一、充电时 1、推荐使用官方充电器和充电管家 2、充电时确保电池处于关闭状态 3、冷却后再充电理想充电温度22-28度 二、使用时 1、首次使用需要充电唤醒电池 2、切勿将电池耗尽过放容易造成电池鼓包 三、储存时 1、存放在环境干燥通风的地方 2、不使用时每两个月充一…