日志系统——整体框架

news2025/1/20 18:21:29

在这里插入图片描述
日志等级模块:
该模块描述了日志消息的各种等级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)方法进行初始化

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1978689.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【Python网络爬虫案例】python爬虫之爬取豆瓣电影信息

🔗 运行环境:PYTHON 🚩 撰写作者:左手の明天 🥇 精选专栏:《python》 🔥 推荐专栏:《算法研究》 #### 防伪水印——左手の明天 #### 💗 大家好🤗&#x1f91…

【C语言】计算四则运算,中缀表达式转换为后缀表达式

C语言编程—中缀表达式转换为后缀表达式 思路: 中缀转后缀保存结果栈:stack,保存数据和-*/ 操作符栈:op_stack,保存-*/() 场景一:遇到数据,直接入栈stack 场景二:遇到"(&qu…

海康笔试题

1. 2. 块设备:磁盘设备驱动、SD设备驱动 字符设备:终端设备驱动 网络设备:网络设备驱动 (1)linux操作系统驱动程序分为三大类:字符设备驱动、快设备驱动和网络设备驱动 (2)字符设…

2024 年华数杯全国大学生数学建模竞赛C 题 老外游中国 完整思路 源代码 模型结果(仅供学习)

最近,“city 不 city”这一网络流行语在外国网红的推动下备受关注。随着我国过境免签政策的落实,越来越多外国游客来到中国,通过网络平台展示他们在华旅行的见闻,这不仅推动了中国旅游业的发展,更是在国际舞台上展现了…

基于X86+FPGA助力实现电力系统的智能监测与高效管理

电力监控 信迈提供基于Intel平台、Xilinx平台、Rockchip平台、NXP平台、飞腾平台的Mini-ITX主板、Micro-ATX主板、ATX主板、嵌入式准系统/工业整机等计算机硬件。产品算力强大,支持高速存储,提供丰富串口、USB、LAN、PCIe扩展接口、显示接口等I/O接口&am…

【python】数据类型之列表类型(上)

本篇文章将讲解列表类型。 列表(list),是一个有序且可变的容器,在里面可以存放多个不同类型的元素。 列表中的元素之间用逗号(英文中的逗号)相隔。 1、定义: 例如: user_list[]…

stl容器 vector的基本操作

目录 1.vector构造 1.1默认构造函数 1.2 fill 填充构造函数 ​编辑 1.3 范围构造函数(Range Constructor) 1.4拷贝构造函数 2.initializer_list初始化vector 3.迭代器 4.常用的几个成员 4.1 size()统计当前有效字符个数 4.2 capacity ve…

青甘环线游记|day(2)|西宁、青海湖

坐动车 早上7:30醒来,在8:00左右起床,下楼吃兰州拉面。面煮的很好吃,就是还是不是很适应。看到8元的牛肉面感觉很震惊,没想到是面8元,牛肉另加,10元。 坐上动车前往西宁,12点左右到了。虽然在…

PXE实现自动安装部署操作系统

PXE(Preboot eXecution Environment)是一种在计算机启动时使用网络接口从远程服务器获取操作系统安装和启动信息的技术。通过PXE,计算机可以从局域网中的PXE服务器上下载操作系统安装文件,并进行自动化的操作系统部署或故障排除。…

25考研数据结构复习·7.4B树和B+树7.5散列(Hash)表

目录 B树和B树 B树 m阶B树的核心特性 B树的插入 B树的删除 非终端结点关键字 终端结点关键字 低于下限 B树 散列(Hash)表 基本概念 散列函数的构造 👩‍💻 除留余数法 直接定址法 数字分析法 平方取中法 处理冲突…

动手学深度学习V2每日笔记(池化层)

本文主要参考沐神的视频教程 https://www.bilibili.com/video/BV1EV411j7nX/spm_id_from333.999.0.0&vd_sourcec7bfc6ce0ea0cbe43aa288ba2713e56d 文档教程 https://zh-v2.d2l.ai/ 本文的主要内容对沐神提供的代码中个人不太理解的内容进行笔记记录,内容不会特别…

Linux基础环境开发工具(二)

目录 一、前言二、make和makefile工具1.快速认识一下2.依赖关系和依赖方法3.执行原理 三、Git工具1.快速认识一下2.git的使用 四、gdb工具1.快速认识一下2、类比Windows使用 一、前言 在开发工具第一篇中我们介绍了yum,vim,gcc/g编译器这几种工具&#…

C++ 继承 派生类的拷贝构造

继承 派生类的拷贝构造构造顺序拷贝构造 引例1: 当子类,不自实现拷贝构造时,默认调用父类的拷贝构造引例2: 子类自实现拷贝构造,不做特殊处理时,只会调用父类的构造器.引例3: 显示的调用父类的拷贝构造器。案例: 内嵌函数的拷贝构造 引例1 :当内嵌子对象,子类不自实现拷贝构造时…

Netty二

Netty 问题分析 bootstrap serverBootstrap pipeline和channelPipeline EventLoopGroup和实现类NioEventLoopGroup

U2net论文复现-简单解读-以及奇奇怪怪的改进-测试roc以及pr

论文地址:U2net论文地址 显著性目标检测: Salient ObjectDetetion(SOD)显著性目标检测,就是要把图片中最显著的物体分割出来,所以是二分类任务,只需要背景和前景。 1、Introduce 1.1、目前存在的2个挑战&#xff1…

Day-11 员工管理案例 增删改查、配置文件

SpringBootWeb案例 前面我们已经实现了员工信息的条件分页查询以及删除操作。 关于员工管理的功能,还有两个需要实现: 新增员工修改员工 首先我们先完成"新增员工"的功能开发,再完成"修改员工"的功能开发。而在"新…

Midjourney、Sora和硅谷机密-《分析模式》漫谈15

DDD领域驱动设计批评文集 做强化自测题获得“软件方法建模师”称号 《软件方法》各章合集 “Analysis Patterns”的Preface(前言)有这么一句: Kent Beck, Ward Cunningham, and Jim Coplein encouraged me to get involved with the commu…

《Advanced RAG》-02-揭开 PDF 解析的神秘面纱

摘要 PDF 文件是非结构化文档的代表,但从 PDF 文档中提取信息是一个具有挑战性的过程。 PDF 文件由一系列指令组成,这些指令指示 PDF 阅读器或打印机在屏幕或纸张上显示符号的位置和方式。与 HTML 和 docx 等文件格式不同,后者使用标记来组织…

8月2日,贪心-买卖股票的最佳时期

大家好呀,今天我们看两道用贪心算法解的两道题,150道经典面试题中的买卖股票的最佳时期1和2。 1.买卖股票的最佳时期1 . - 力扣(LeetCode) 思路 对于这题,我们其实很容易想出暴力解,那就是从后往前找值&…

【文件系统】抽象磁盘的存储结构 CHS寻址法 | sector数组 | LAB数组

目录 1.为什么要抽象 2.逻辑抽象_版本1 2.1sector数组 ​2.2index转化CHS 3.逻辑抽象_版本2 3.1LBA数组 3.2LAB下标转化sector下标 文件其实就是在磁盘中占有几个扇区的问题❗文件是很多个sector的数组下标❗文件是有很多块构成的❗❗文件由很多扇区构成------>文件…