[C++]——同步异步日志系统(4)
创始人
2024-11-03 17:11:44

同步异步日志系统

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

一、日志等级模块设计

  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, // 未知等级的日志             DEBUG,      // 调试等级的日志             INFO,       // 提示等级的日志             WARN,       // 警告等级的日志             ERROR,      // 错误等级的日志             FATAL,      // 致命错误等级的日志             OFF,        // 关闭所有⽇志输出         };         // 转换接口         static const char *tostring(loglevel::value level)         {             switch (level)             {             case loglevel::value::DEBUG:                 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<
  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  #include  #include  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::DEBUG, 123,"main.c","root","我错了");     std::cout<<"编译没有错误"<

在这里插入图片描述

相关内容

热门资讯

裸辞做“一人公司”,我后悔了 去年这个时候,一位以色列程序员正在东南亚旅行。他顺手把一个在脑子里转了很久的想法做成了产品,一个让任...
南京建成国内首个Pre-6G试... 4月21日,2026全球6G技术与产业生态大会在南京开幕。全息互动技术展台前,一名远在北京的工作人员...
超梵求职受邀参加“2025抖音... 超梵求职受邀参加“2025抖音巨量引擎成人教育行业生态大会”,探讨分享优质内容传播,服务万千学员。 ...
摩托罗拉Razr 2026(R... IT之家 4 月 22 日消息,摩托罗拉宣布新一代 Razr 折叠手机将于 4 月 29 日在美国发...
库克卸任,特纳斯领航:苹果新纪... 苹果首席执行官蒂姆·库克将卸任,硬件工程主管约翰·特纳斯将接任,苹果公司今天宣布此事。 库克将在夏季...