日志系统——整体框架

在这里插入图片描述
日志等级模块:
该模块描述了日志消息的各种等级debug,info,warn,error,fatal,off(off为最高等级,屏蔽一切日志消息),并提供描述日志等级的方法
日志消息模块:
该模块负责构建日志消息对象,此对象管理着一条日志中的各项要素——包括日志产生时间,日志等级,日志主题消息,日志产生线程,日志器,日志消息所在文件,日志消息所在行标
日志格式化模块:
该模块负责将一个日志消息对象进行格式化,将各个零散的日志要素序列化为字符串信息。
此模块采用简单工厂模式构建子格式化对象,每一个子格式化对象负责格式化指定的内容
日志落地模块:
该模块负责将日志字符串输出到标准输出or指定文件or滚动文件,采用简单工厂模式构建具体的落地对象
日志器模块:
管理上述四个模块,宏观指挥一条日志从产生到落地的全过程,采用建造者模式初始化各项属性(无需指挥者),
管理的属性,构建日志消息对象所需要的一系列属性,格式化对象格式化处理时所需要用到的参照格式
异步缓冲区模块:
基于双缓冲区实现的生产者消费者模型,业务线程将日志字符串写入缓冲区,具体的日志落地由一个线程负责处理
日志器管理模块:
该模块负责管理已经构建的全局日志器,全局有且只有一份,采用单例模式,向用户提供获取指定名称日志器的方法,并通过代理模式简化函数调用请添加图片描述

工具类实现

由于在构造日志对象和落地输出时需要频繁获取时间戳和文件,这里提前编写获取时间戳,获取路径,创建目录的方法并使用util命名空间进行作用域限定

namespace util
{
	class Date
    {
    public:
        static time_t getTime(){return time(nullptr);} // 获取时间戳
    };

    class File
    {
    public:
        static bool exist(const std::string &path) // 判断文件是否存在
        { 	
        	struct stat st;
    		int n = stat(path.c_str(), &st);
    		return n == 0;
    	}           
        static std::string path(const std::string &path)     // 获取文件所在路径
        {
        	 size_t pos = path.find_last_of("/\\"); //find_last_of用于在字符串中找到最后一个'/'或'\'的位置
   	 		 if (pos == std::string::npos) return "."; //当前目录
   	 		 return path.substr(0, 1 + pos);
    	}
        static void createDirectory(const std::string &path) // 创建目录
    	{
    		size_t pos = 0, index = 0;
		    while (index != std::string::npos)
		    {
		        index = path.find_first_of("/\\", pos); //从pos位置开始查找
		        pos = index + 1;
		        if (exist(path.substr(0, index))) continue;
		        else mkdir(path.substr(0, index).c_str(), 0777)//检索每一级目录,存在跳过,不存在则创建
		    }
    	}
    };
}

日志等级模块的具体实现

class LogLevel
{
public:
    enum Level
    {
        UNKNOW = 0,
        DEBUG,	//调试日志
        INFO,	//提示日志
        WARN,	//警告日志
        ERROR,	//错误日志
        FATAL,	//崩溃日志
        OFF		//关闭
    };
    static const char *toString(Level level) // 将枚举变量转化为字符串输出
	{
    switch (level)
    {
    case OFF:
        return "OFF";
    case DEBUG:
        return "DEBUG";
    case INFO:
        return "INFO";
    case WARN:
        return "WARN";
    case ERROR:
        return "ERROR";
    case FATAL:
        return "FATAL";
    default:
        return "UNKNOW";
    }
}
};

日志消息模块的具体实现:

class LogMsg
{
public:
    time_t _time;           // 时间戳
    LogLevel::Level _level; // 日志等级
    std::string _file;      // 所在文件
    size_t _line;           // 所在文件行数
    std::thread::id _tid;   // 线程ID
    std::string _payload;   // 正文
    std::string _logger;    // 日志器

    LogMsg(
        LogLevel::Level level,
        const std::string &file,
        size_t line,
        const std::string &payload,
        const std::string &logger);
};  /*此处省略构造函数的定义:使用初始化列表对各项属性进行初始化*/

_time可以通过util中的getTime方法进行初始化,_tid使用syscall(SYS_gettid)方法进行初始化

  • 14
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Shall#

你的鼓励将是我前进的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值