[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;
}

在这里插入图片描述

相关推荐

  1. 运用多设计模式的同步&异步滚动日志系统

    2024-07-12 09:44:04       42 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-07-12 09:44:04       66 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-07-12 09:44:04       70 阅读
  3. 在Django里面运行非项目文件

    2024-07-12 09:44:04       57 阅读
  4. Python语言-面向对象

    2024-07-12 09:44:04       68 阅读

热门阅读

  1. springmvc-03

    2024-07-12 09:44:04       23 阅读
  2. 大模型论文、github地址汇总

    2024-07-12 09:44:04       26 阅读
  3. 笔记小结:Softmax回归之模块导入与数据加载

    2024-07-12 09:44:04       30 阅读
  4. 视频调整帧率、分辨率+音画同步

    2024-07-12 09:44:04       28 阅读
  5. Linux - VIM 全面教程

    2024-07-12 09:44:04       25 阅读
  6. Three 圆柱坐标(Cylindrical)和 视锥体(Frustum)

    2024-07-12 09:44:04       34 阅读