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

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.mzph.cn/news/224386.shtml

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

相关文章

SuperMap iClient3D for Cesium 实现鼠标移动选中模型并显示模型对应字段

SuperMap iClient3D for cesium 实现鼠标移动选中模型并显示模型对应字段 一、实现思路二、数据制作1. 计算出模型中心点并保存到属性表中2. 计算出模型顶部高程3. 模型数据切缓存4. 发布三维服务. 三、代码编写 作者&#xff1a;xkf 一、实现思路 将模型属性数据存储到前端&a…

深度学习环境配置

一、Anaconda安装 下载&#xff1a;从清华大学开源软件镜像下载 镜像网址 出现base即为安装成功&#xff1a; 检查显卡的驱动是否正确安装&#xff1a; &#xff08;GPU可以显示出名称&#xff09; GPU0是集显集成显卡是主板自带的显卡。 GPU1是独显即独立显卡&#xff0c…

[渗透测试学习] Codify - HackTheBox

首先nmap扫描端口 nmap -sV -sC -p- -v --min-rate 1000 10.10.11.239扫出来三个端口&#xff0c;22端口为ssh服务&#xff0c;80端口有http服务&#xff0c;3000端口为nodejs框架 尝试访问下80端口&#xff0c;发现页面重定向 将该域名添加到hosts里 sudo vim /etc/hosts 成…

el-table的复选框占满全格

el-table的复选框格子很小每次点击都点不到&#xff0c;又不想设置行点击&#xff0c;因为每次复制内容都会选中&#xff0c;实现效果是点击el-table的复选框单元格就可以选中 <template><div style"width: 60vw; margin: 10px;"><el-table :data&quo…

Java小案例-RocketMQ的11种消息类型,你知道几种?(延迟消息)

前言 上一节给大家讲了Rocket的顺序消息&#xff0c;这一节和大家聊一下延迟消息&#xff0c;关于顺序消息大家可以点下面这个链接直接看 RocketMQ的延迟消息 延迟消息 延迟消息就是指生产者发送消息之后&#xff0c;消息不会立马被消费&#xff0c;而是等待一定的时间之后…

计算机硬件 3.3其他存储设备

第三节 其他存储设备 一、固态硬盘&#xff08;SSD&#xff09; 1.优点&#xff1a;读写速度快、防震抗摔、低功耗、无噪声、轻便。 2.缺点&#xff1a;容量小、寿命限制、售价高。 3.接口&#xff1a;SATA3、M.2、Type-C、mSATA等。 4.分类&#xff1a;盒装式、插卡式。 二…

十五 动手学深度学习v2计算机视觉 ——全连接神经网络FCN

文章目录 FCN FCN 全卷积网络先使用卷积神经网络抽取图像特征&#xff0c;然后通过卷积层将通道数变换为类别个数&#xff0c;最后通过转置卷积层将特征图的高和宽变换为输入图像的尺寸。 因此&#xff0c;模型输出与输入图像的高和宽相同&#xff0c;且最终输出通道包含了该空…

海思平台isp之ccm标定

文章目录 1、raw图采集2、ccm标定2.1、标定参数配置2.2、标定效果优化2.2.1、优化方式一2.2.2、优化方式二2.2.3、优化方式三1、raw图采集 raw图采集步骤及标准,请参考文章 《海思平台isp之ccm标定》。2、ccm标定 2.1、标定参数配置 (1)图像基本参数 (2)黑电平设置 (…

Spring-MVC-文件上传下载

依赖 <dependency><groupId>commons-fileupload</groupId><artifactId>commons-fileupload</artifactId><version>1.3.3</version> </dependency> <dependency><groupId>javax.servlet</groupId><artif…

mac视频调色 DaVinci Resolve Studio 18 中文 for Mac

DaVinci Resolve Studio 18是一款功能强大、专业可靠的视频编辑软件&#xff0c;适用于各种规模的媒体项目制作。无论是独立制片人还是大型制片公司&#xff0c;都可以借助该软件进行高质量的视频创作和后期制作。 得编辑工作更加高效和灵活。 调色和色彩校正&#xff1a;软件…

国外博士论文下载网址

系列文章目录 前言 如果你想补充其他相关网址&#xff0c;请留言 一、pqdtcn 1.1 使用说明 浏览本数据库建议使用chrome浏览器&#xff01; ProQuest检索平台在今年暑假做了界面升级。为了使您能更快了解升级后的界面功能&#xff0c;ProQuest公司准备了中文版用户使用手册…

【CSS】前端点点点加载小点样式css动画过程实现

对话的 ... 加载动画&#xff0c;直接用 CSS 就可以实现&#xff0c;样式可以自己改&#xff0c;逻辑大差不差 <div class"loading-text"><span class"dot1"></span><span class"dot2"></span><span class&quo…

RabbitMQ入门案例

RabbitMQ 是目前比较主流的MQ消息队列中间件&#xff0c;下面简单总结RabbitMQ入门时所做的一些笔记 1.RabbitMQ 入门案例 需求&#xff1a;用 Java 编写两个程序。发送单个消息的生产者和接收消息并打印出来的消费者 1.1 添加依赖 <!--rabbitmq 依赖客户端--> <de…

Java 线程创建的方法和原理

创建线程 方法一&#xff1a;Thread 类 创建Thread类的对象&#xff0c;重写其中的 run 方法&#xff1a; Slf4j(topic "c.Test1") public class d1_Thread {public static void main(String[] args) {// 创建 Thread 类的对象Thread t new Thread(){Overridepu…

SQL进阶理论篇(六):索引的使用原则

文章目录 简介什么时候创建索引&#xff1f;什么时候不需要创建索引索引在什么情况下会失效索引使用举例&#xff08;兴趣篇&#xff09;参考文献 简介 如何通过索引让查询效率最大化呢&#xff1f;本节主要考虑以下几个问题&#xff1a; 什么样的情况下需要创建索引&#xf…

C++中的reverse函数

1.实现反转数组。 //头文件 #include <algorithm> //使用方法 reverse(a, an);//n为数组中的元素个数 #include<cstdio> #include<iostream> #include<algorithm> using namespace std; int main() {int a[100];int n,k;cin >> n >> k; …

基于SpringBoot的停车位预约管理系统

文章目录 项目介绍主要功能截图:部分代码展示设计总结项目获取方式🍅 作者主页:超级无敌暴龙战士塔塔开 🍅 简介:Java领域优质创作者🏆、 简历模板、学习资料、面试题库【关注我,都给你】 🍅文末获取源码联系🍅 项目介绍 基于SpringBoot的停车位预约管理系统,ja…

八大排序(插入排序 | 选择排序 | 冒泡排序)

在我们内存中我们一般会有一些没有顺序的数据&#xff0c;我们成为内排序&#xff0c;而今天分享八大排序的是时间复杂度为O&#xff08;N^2&#xff09;的插入排序&#xff0c;选择排序和教学意义比较强的冒泡排序。 插入排序 这是插入排序的动图&#xff0c;通过动图我们也…

PHP中如何处理文件上传?

在 PHP 中处理文件上传通常涉及到以下几个步骤&#xff1a; HTML 表单设置&#xff1a; 在 HTML 表单中设置 enctype 属性为 "multipart/form-data"&#xff0c;这是处理文件上传所必须的。 <form action"upload.php" method"post" enctype&q…

Python3 中常见的数据类型

目录 数字(Number)总结 字符串(String)字符串运算符字符串格式化字符串的截取总结 List&#xff08;列表&#xff09;更新列表删除列表元素列表函数&方法总结 Tuple&#xff08;元组&#xff09;修改元组删除元组总结 Set&#xff08;集合&#xff09;Dictionary&#xff0…