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

CSDN 2024-08-07 12:05:02 阅读 60

同步异步日志系统

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

一、日志等级模块设计

定义出日志系统所包含的所有日志等级分别为:(7个等级)

UNKNOW=0,未知等级的日志DRBUG ,调试等级的日志INFO ,提示等级的日志WARN ,警告等级的日志ERROR ,错误等级的日志FATAL ,致命错误等级的日志OFF,关闭所有⽇志输出

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

提供一个接口,将对应等级进行枚举,转化为一个对应的字符串首先需要把架子搭起来,功能先声明好。

<code>/*

1.定义枚举类,枚举出日志等级

2.提供转换接口,将枚举转换位对应的字符串

*/

namespace logslearn{

//等级模块

class level{

public:

//定义枚举类

enum class value{ };

//转换接口

static const char *tostring(level::value level);

};

}

其次在实现各个功能。

/*

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";

}

};

}

我们每次编写完一个模块后,要对其进行单元测试,确保程序的准确性。

//测试代码

#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::EEROR)<<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;

}

界面展示

make运行之后

在这里插入图片描述

二、日志消息类设计

意义:中间存储一条日志消息所需要的各项要素

日志的输出时间:用于过滤日志输出时间

日志等级:用于进行日志过滤分析

源文件名称

源代码行号:用于定位出错的代码位置

线程ID:用于过滤出错的线程

日志主体消息

日志器名称:支持多日志器的同时使用

如:每一条日志打印,都会加上这些消息

[2024-07-09 17:04][root][1234567][main.c:99][FATAL]: 创建套接字失…我们在构造一条消息的时候,调用构造函数进行构造,传入各项参数,就可以完成一条消息的构造.

对消息的各个要素进行设计,并且完成构造。

<code>/*

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)

{ }

};

}

这里我们只是定义一个结构体,没有办法进行测试,因此我们只需要构造一个结构体并且没有编译错误就可以了

//测试代码

#include "util.hpp"

#include "level.hpp"

#include "message.hpp"

int main()

{

//消息类模块构造

logslearn::LogMsg(logslearn::loglevel::value::DEBUG, 123,"main.c","root","我错了");

std::cout<<"编译没有错误"<<std::endl;

return 0;

}

在这里插入图片描述



声明

本文内容仅代表作者观点,或转载于其他网站,本站不以此文作为商业用途
如有涉及侵权,请联系本站进行删除
转载本站原创文章,请注明来源及作者。