一、日志等级模块设计
- 定义出日志系统所包含的所有日志等级分别为:(7个等级)
- UNKNOW=0,未知等级的日志
- DRBUG ,调试等级的日志
- INFO ,提示等级的日志
- WARN ,警告等级的日志
- ERROR ,错误等级的日志
- FATAL ,致命错误等级的日志
- OFF,关闭所有⽇志输出
每一个项目中都会设置一个默认的日志输出等级,只有输出的日志等级大于等于默认限制等级的时候才可以进行输出。
- 提供一个接口,将对应等级进行枚举,转化为一个对应的字符串
- 首先需要把架子搭起来,功能先声明好。
namespace logslearn{
class level{
public:
enum class value{};
static const char *tostring(level::value level);
};
}
- 其次在实现各个功能。
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";
}
};
}
- 我们每次编写完一个模块后,要对其进行单元测试,确保程序的准确性。
#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;
}
- 界面展示
make运行之后
二、日志消息类设计
- 意义:中间存储一条日志消息所需要的各项要素
日志的输出时间:用于过滤日志输出时间
日志等级:用于进行日志过滤分析
源文件名称
源代码行号:用于定位出错的代码位置
线程ID:用于过滤出错的线程
日志主体消息
日志器名称:支持多日志器的同时使用
如:每一条日志打印,都会加上这些消息
[2024-07-09 17:04][root][1234567][main.c:99][FATAL]: 创建套接字失… - 我们在构造一条消息的时候,调用构造函数进行构造,传入各项参数,就可以完成一条消息的构造.
对消息的各个要素进行设计,并且完成构造。
#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;
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::DRBUG, 123,"main.c","root","我错了");
std::cout<<"编译没有错误"<<std::endl;
return 0;
}