C++项目实战——基于多设计模式下的同步&异步日志系统-⑥-日志等级类与日志消息类设计

文章目录

专栏导读

🌸作者简介:花想云,在读本科生一枚,C/C++领域新星创作者,新星计划导师,阿里云专家博主,CSDN内容合伙人...致力于 C/C++、Linux 学习。

🌸专栏简介:本文收录于 C++项目------基于多设计模式下的同步与异步日志系统

🌸相关专栏推荐:C语言初阶系列C语言进阶系列C++系列数据结构与算法Linux

日志等级类设计

对于日志等级类,我们主要完成两个功能:

  • 定义枚举类
  • 实现转换接口

日志等级类中使用枚举来设置日志等级,并提供一个将日志等级转化为对应字符串的功能。

日志等级划分

日志等级分为以下7个等级:

  • OFF:关闭;
  • DEBUG:调式,调试时的关键信息输出;
  • INFO:提示,普通的提示性日志信息;
  • WARN:警告,不影响运行,但是需要注意的日志;
  • ERROR:错误,程序运行时出现错误的日志;
  • FATAL:致命,一般是代码导致程序无法正常运行的日志;
  • UNKOW:未知,表示未知错误。
cpp 复制代码
enum class value
{
    UNKNOW = 0,
    DEBUG,
    INFO,
    WARN,
    ERROR,
    FATAL,
    OFF
};

to_string函数设计

函数设计思路较为简单,函数参数为value类型,表示日志等级。使用switch语句进行选择输出对应字符串。

cpp 复制代码
static const char* tostring(LogLevel::value level)
{
    switch (level)
    {
    case LogLevel::value::DEBUG : return "DEBUG";
    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"; 
    default: return "UNKNOW";
    }
}

日志等级类整理

cpp 复制代码
/*
    日志等级类实现:
    1.定义枚举类
    2.转换接口
*/

#ifndef __M_LEVEL_H__
#define __M_LEVEL_H__

namespace LOG
{
    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 "DEBUG";
                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"; 
                default: return "UNKNOW";
                }
            }
    };
}
#endif

日志消息类设计

日志消息类主要是封装一条完整的日志消息所需的内容,其中包括:

  • 时间:描述本条日志输出的时间;
  • 线程ID:描述本条日志是哪一个线程输出的;
  • 日志等级:描述本条日志的等级;
  • 日志文件名:描述本条日志在哪一个源码文件中输出的;
  • 日志行号:描述本条日志在源码文件的哪一行输出的;
  • 日志器名称:描述打印本条日志的日志器名称;
  • 日志数据:本条日志的有效数据载荷。

日志消息类设计较为简单,如下:

cpp 复制代码
#ifndef __M_MSG_H__
#define __M_MSG_H__

/*
    定义日志消息类:
    1.日志的输出时间
    2.日志等级
    3.源文件名称
    4.源代码行号
    5.线程ID
    6.日志主体消息
    7.日志器名称
*/

#include <iostream>
#include <string>
#include <thread>
#include "util.hpp"
#include "level.hpp"

namespace LOG
{
    struct LogMsg
    {
        time_t _ctime; // 日志输出时间
        LogLevel::value _level; // 日志等级
        std::string _file; // 源文件名称
        size_t _line; // 源文件行号
        std::thread::id _tid; // 线程ID
        std::string _logger; // 日志器名称
        std::string _payload; // 日志主体消息

        LogMsg(LogLevel::value level,
            size_t line,
            const std::string file,
            const std::string logger,
            const std::string msg
        ) : 
        _ctime(util::Date::getTime()),
        _level(level),
        _line(line),
        _tid(std::this_thread::get_id()), // get_id 获取当前线程的ID
        _file(file),
        _logger(logger),
        _payload(msg) {}
    };
}
#endif
相关推荐
liulilittle2 小时前
深度剖析:OPENPPP2 libtcpip 实现原理与架构设计
开发语言·网络·c++·tcp/ip·智能路由器·tcp·通信
在未来等你2 小时前
设计模式精讲 Day 22:模板方法模式(Template Method Pattern)
设计模式·模板方法模式·软件架构·java开发·面向对象设计·设计模式实战·java应用开发
十年编程老舅3 小时前
跨越十年的C++演进:C++20新特性全解析
c++·c++11·c++20·c++14·c++23·c++17·c++新特性
花好月圆春祺夏安4 小时前
基于odoo17的设计模式详解---代理模式
设计模式·代理模式
小刘同学3214 小时前
C++11 特性
c++·c11新特性
真的想上岸啊5 小时前
学习C++、QT---18(C++ 记事本项目的stylesheet)
开发语言·c++·学习
m0_552200825 小时前
《UE5_C++多人TPS完整教程》学习笔记40 ——《P41 装备(武器)姿势(Equipped Pose)》
c++·游戏·ue5
丁劲犇5 小时前
用 Turbo Vision 2 为 Qt 6 控制台应用创建 TUI 字符 MainFrame
开发语言·c++·qt·tui·字符界面·curse
charlie1145141916 小时前
深入理解Qt的SetWindowsFlags函数
开发语言·c++·qt·原理分析