【5】基于多设计模式下的同步异步日志系统-代码设计

news/2025/1/11 23:57:53/

8. 代码设计

8.1 实用类设计

提前完成⼀些零碎的功能接⼝,以便于项⽬中会⽤到。
• 获取系统时间
• 判断⽂件是否存在
• 获取⽂件的所在⽬录路径
• 创建⽬录

/*
通⽤功能类,与业务⽆关的功能实现1. 获取系统时间2. 获取⽂件⼤⼩3. 创建⽬录4. 获取⽂件所在⽬录
*/
#ifndef __M_UTIL_H__
#define __M_UTIL_H__
#include <iostream>
#include <fstream>
#include <sstream>
#include <string>
#include <ctime>
#include <cassert>
#include <sys/stat.h>
namespace bitlog{namespace util{class date {public:static size_t now() { return (size_t)time(nullptr); }};class file {public:static bool exists(const std::string &name) {struct stat st;return stat(name.c_str(), &st) == 0;}static std::string path(const std::string &name) {if (name.empty()) return ".";size_t pos = name.find_last_of("/\\");if (pos == std::string::npos) return ".";return name.substr(0, pos + 1);}static void create_directory(const std::string &path) { if (path.empty()) return ;if (exists(path)) return ;size_t pos, idx = 0;while(idx < path.size()) {pos = path.find_first_of("/\\", idx);if (pos == std::string::npos) {mkdir(path.c_str(), 0755);return;}if (pos == idx) {idx = pos + 1; continue;}std::string subdir = path.substr(0, pos);if (subdir == "." || subdir == ".."){idx = pos + 1; continue;}if (exists(subdir)) {idx = pos + 1; continue;}mkdir(subdir.c_str(), 0755);idx = pos + 1;}}};}
}
#endif

8.2 日志等级类设计

日志等级总共分为7个等级,分别为:
• OFF 关闭所有⽇志输出
• DRBUG 进⾏debug时候打印⽇志的等级
• INFO 打印⼀些⽤⼾提⽰信息
• WARN 打印警告信息
• ERROR 打印错误信息
• FATAL 打印致命信息- 导致程序崩溃的信息

#ifndef __M_LEVEL_H__
#define __M_LEVEL_H__
namespace bitlog{class LogLevel{public:enum class value {DEBUG,INFO,WARN,ERROR,FATAL,OFF};static const char *toString(LogLevel::value l) {switch(l) {#define TOSTRING(name) #namecase LogLevel::value::DEBUG: return TOSTRING(DEBUG);case LogLevel::value::INFO: return TOSTRING(INFO);case LogLevel::value::WARN: return TOSTRING(WARN);case LogLevel::value::ERROR: return TOSTRING(ERROR);case LogLevel::value::FATAL: return TOSTRING(FATAL);case LogLevel::value::OFF: return TOSTRING(OFF);#undef TOSTRINGdefault: return "UNKNOW";}return "UNKNOW";}};
}
#endif

8.3 日志消息类设计

日志消息类主要是封装⼀条完整的⽇志消息所需的内容,其中包括⽇志等级、对应的logger name、打印日志源⽂件的位置信息(包括⽂件名和⾏号)、线程ID、时间戳信息、具体的⽇志信息等内容。

#ifndef __M_MSG_H__
#define __M_MSG_H__
#include "util.hpp"
#include "level.hpp"
#include <thread>
namespace bitlog{struct LogMsg {using ptr = std::shared_ptr<LogMsg>;size_t _line;//⾏号size_t _ctime;//时间std::thread::id _tid;//线程IDstd::string _name;//⽇志器名称std::string _file;//⽂件名std::string _payload;//⽇志消息LogLevel::value _level;//⽇志等级LogMsg() {}LogMsg( std::string name, std::string file, size_t line, std::string payload, LogLevel::value level):_name(name), _file(file), _payload(payload), _level(level),_line(line), _ctime(util:: date::now()),_tid(std::this_thread::get_id()) {}};
}
#endif

http://www.ppmy.cn/news/1270851.html

相关文章

Linux 常用命令----mktemp 命令

文章目录 基本用法实例演示高级用法注意事项 mktemp 命令用于创建一个临时文件或目录&#xff0c;这在需要处理临时数据或进行安全性测试时非常有用。使用 mktemp 可以保证文件名的唯一性&#xff0c;避免因文件名冲突而导致的问题。 基本用法 创建临时文件: 命令 mktemp 默认…

进程调度的题解

目录 原题大意&#xff1a; 题目描述&#xff1a; 输入格式&#xff1a; 输出格式&#xff1a; 样例输入&#xff1a; 样例输出&#xff1a; 数据规模&#xff1a; 题目大意&#xff1a; 主要思路&#xff1a; dp的转移&#xff1a; dp初始化&#xff1a; 代码&…

基于高通MSM8953平台的android系统GPIO驱动开发

一、GPIO驱动: 1.1、注册设备: 1.1.1、创建文件: 1)、在kernel/msm-4.9/drivers/下创建july文件夹。 2)、在july文件夹下创建Kconfig、Makefile、ledctrl.c文件。 3)、修改Kconfine文件: 添加 source "drivers/july/Kconfig" 4)、修改Makefile文件: 添…

ubuntu下搜索文件的几种方法

一、whereis命令&#xff1a; whereis命令只能用于程序名的搜索&#xff0c;而且只搜索二进制文件(参数-b)、man说明文件(参数-m)和源代码文件(参数-s)。如果省略参数&#xff0c;则返回所有信息。 whereis的命令格式&#xff1a; whereis [-bmsu] [BMS 目录名 -f ] 文…

【Python】按升序排列 Excel 工作表

发现按名称对 Excel 工作表进行排序很麻烦&#xff0c;因此创建了一个代码来使用 Python 的 openpyxl 对它们进行排序。 1. 本次创建的代码概述 在GUI中指定一个Excel文件&#xff08;使用Tkinter。这是一个标准模块&#xff0c;因此不需要安装&#xff09;加载Excel文件&…

计算机组成原理—总线

文章目录 总线概述总线的作用串行总线与并向总线总线分类总线结构 总线性能指标总线仲裁集中仲裁链式查询计数器查询独立请求 分布式仲裁 总线操作和计时同步定时方式异步通信半同步通信分离式通信 计组真的太难了&#xff01; 这一章节安排的目的其实是有种亡羊补牢的安排意思…

Kibana搜索数据利器:KQL与Lucene

文章目录 一、搜索数据二、KQL查询1、字段搜索2、逻辑运算符3、通配符4、存在性检查5、括号 三、Lucene查询1、字段搜索2、逻辑运算符3、通配符4、范围搜索5、存在性检查6、括号 四、总结 一、搜索数据 默认情况下&#xff0c;您可以使用 Kibana 的标准查询语言&#xff0c;该…

优先考虑泛型

Java中的泛型&#xff08;Generics&#xff09;提供了一种参数化类型的机制&#xff0c;使得你可以编写更灵活、类型安全的代码。下面是一个例子&#xff0c;说明在Java中优先考虑泛型的好处&#xff1a; 考虑一个简单的容器类&#xff0c;它可以存储任意类型的元素&#xff0…