南山网站建设-信科网络wordpress前台英文后台中文
南山网站建设-信科网络,wordpress前台英文后台中文,网站开发是先做前段还是后台,网站建设公司网络服务#x1f4df;作者主页#xff1a;慢热的陕西人 #x1f334;专栏链接#xff1a;C基于多设计模式下的同步异步日志系统 #x1f4e3;欢迎各位大佬#x1f44d;点赞#x1f525;关注#x1f693;收藏#xff0c;#x1f349;留言 主要内容实现了日志代码设计的实… 作者主页慢热的陕西人 专栏链接C基于多设计模式下的同步异步日志系统 欢迎各位大佬点赞关注收藏留言 主要内容实现了日志代码设计的实用类设计日志等级设计日志消息类设计。 文章目录 C基于多设计模式下的同步异步日志系统day21.日志系统框架设计1.1模块划分1.2模块关系图 2.代码设计2.1实用类设计2.2日志等级类设计2.3日志消息类的设计 C基于多设计模式下的同步异步日志系统day2
1.日志系统框架设计
本项⽬实现的是⼀个多⽇志器⽇志系统主要实现的功能是让程序员能够轻松的将程序运⾏⽇志信息落地到指定的位置且⽀持同步与异步两种⽅式的⽇志落地⽅式。项⽬的框架设计将项⽬分为以下⼏个模块来实现。
1.1模块划分 ⽇志等级模块对输出⽇志的等级进⾏划分以便于控制⽇志的输出并提供等级枚举转字符串功能。 OFF:关闭DEBUG:调试调试时的关键信息输出INFO:提示普通的提示性日志信息WARN:警告不影响运行但是需要注意一下的日志ERROR:错误程序运行出现错误的日志FATAL:致命一般是代码异常导致程序无法继续推进的运行的日志 日志消息模块中间存储日志输出所需的个各项要素信息 时间描述本条日志的输出时间线程ID描述本条日志是哪个线程输出的日志等级描述本条日志的等级日志数据本条日志的有效载荷数据日志文件名描述本条日志在哪个源码文件中输出的日志行号描述本条日志在源码文件的哪一行输出的 ⽇志消息格式化模块设置⽇志输出格式并提供对⽇志消息进⾏格式化功能 系统的默认⽇志输出格式%d{%H:%M:%S}%T[%t]%T[%p]%T[%c]%T%f:%l%T%m%n-13:26:32 [2343223321] [FATAL] [root] main.c:76套接字创建失败\n%d{%H:%M:%S}表⽰⽇期时间花括号中的内容表⽰⽇期时间的格式%T表⽰制表符缩进%t表⽰线程ID%p表⽰⽇志级别%c表⽰⽇志器名称不同的开发组可以创建⾃⼰的⽇志器进⾏⽇志输出⼩组之间互不影响%f表⽰⽇志输出时的源代码⽂件名%l表⽰⽇志输出时的源代码⾏号%m表⽰给与的⽇志有效载荷数据%n表⽰换⾏设计思想设计不同的⼦类不同的⼦类从⽇志消息中取出不同的数据进⾏处理 ⽇志消息落地模块决定了⽇志的落地⽅向可以是标准输出也可以是⽇志⽂件也可以滚动⽂ 件输出… 标准输出表⽰将⽇志进⾏标准输出的打印⽇志⽂件输出表⽰将⽇志写⼊指定的⽂件末尾滚动⽂件输出当前以⽂件⼤⼩进⾏控制当⼀个⽇志⽂件⼤⼩达到指定⼤⼩则切换下⼀个⽂件进⾏输出后期也可以扩展远程⽇志输出创建客⼾端将⽇志消息发送给远程的⽇志分析服务器设计思想设计不同的⼦类不同的⼦类控制不同的⽇志落地⽅向 ⽇志器模块 此模块是对以上⼏个模块的整合模块⽤⼾通过⽇志器进⾏⽇志的输出有效降低⽤⼾的使⽤难度包含有⽇志消息落地模块对象⽇志消息格式化模块对象⽇志输出等级 ⽇志器管理模块 为了降低项⽬开发的⽇志耦合不同的项⽬组可以有⾃⼰的⽇志器来控制输出格式以及落地⽅向因此本项⽬是⼀个多⽇志器的⽇志系统管理模块就是对创建的所有⽇志器进⾏统⼀管理。并提供⼀个默认⽇志器提供标准输出的⽇志输出 异步线程模块 实现对⽇志的异步输出功能⽤⼾只需要将输出⽇志任务放⼊任务池异步线程负责⽇志的落地输出功能以此提供更加⾼效的⾮阻塞⽇志输出
1.2模块关系图 2.代码设计
2.1实用类设计
提前完成⼀些零碎的功能接⼝以便于项⽬中会⽤到
获取系统时间判断⽂件是否存在获取⽂件的所在⽬录路径创建⽬录
/*实用工具类的实现1.获取系统时间2.判断文件是否存在3.获取文件所在路径4.创建目录
*/#includeiostream
#includectime
#includeunistd.h
#includesys/stat.hnamespace xupt
{namespace util{class Date{public:static size_t GetTime(){return (size_t)time(nullptr);} };class File{public:static bool exist(const std::string pathname){//确保平台移植性我们不是用这个接口//return (access(pathname.c_str(), F_OK) 0); //F_OK,文件存在且权限允许返回0struct st;if(stat(pathname.c_str(), st) 0){return false;}return true;}static std::string path(const std::string pathname){size_t pos pathname.find_last_of(/\\); /*从路径字符串的后面开始寻找第一个/或者\ */if(pos std::string.npos) return .; //如果没有找到那么证明这个文件就在当前的目录return pathname.substr(0, pos 1); //输出包含最后一个/的位置的字符串}static void CreateDirectory(const std::string pathname){size_t pos 0, idx 0;while(idx pathname.size()){pos pathname.find_first_of(/\\); //寻找第一个/或者\if(pos std::string.npos){mkdir(pathname, 0777); //如果没有分隔符那么就直接创建并且设置权限为0777}std::string parent_dir pathname.substr(0, idx pos 1); //截取包含从开始到/的父目录if(exist(parent_dir) true) { idx pos 1; continue; } //如果当前的目录存在了那么就跳过去找下一个mkdir(parent_dir, 0777);idx pos 1;}}};}
}2.2日志等级类设计
①日志等级总共分为7个等级分别为
UNKNOW表示未知错误DRBUG进⾏debug时候打印⽇志的等级INFO打印⼀些⽤⼾提⽰信息WARN打印警告信息ERROR打印错误信息FATAL打印致命信息-导致程序崩溃的信息OFF关闭所有日志输出
每一个项目中都会设置一个默认的日志输出等级只有输出的日志等级大于等于默认限制等级的时候才可以进行输出
②提供一个接口将对应等级的枚举转换为一个对应的字符串。
/*1.定义枚举类枚举出日志等级2.提供转换接口:将枚举转换为对应字符串
*/
#ifndef __M_LEVEL_H__
#define __M_LEVEL_H__namespace xupt
{class LogLevel{public:enum class value{UNKOWN 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;}return UNKOWN;}};
}#endif
2.3日志消息类的设计
⽇志消息类主要是封装⼀条完整的⽇志消息所需的内容其中包括⽇志等级、对应的loggername、打 印⽇志源⽂件的位置信息包括⽂件名和⾏号、线程ID、时间戳信息、具体的⽇志信息等内容
定义日志消息类进行日志中间信息的存储:1.日志的输出时间 用于过滤日志输出时间2.日志等级 用于进行日志过滤分析3.源文件名称 4.源代码行号 用于定位出现错误的代码位置5.线程ID 用于过滤出错的线程6.日志主体消息7.日志器名称 (当前支持多日志器的同时使用)
*/
#ifndef __M_MESSAGE_H__
#define __M_MESSAGE_H__#includeutil.hpp
#includelevel.hpp
#includeiostream
#includestring
#includethreadnamespace xupt
{struct LogMsg{size_t _ctime; //日志产生的时间LogLevel::value _level; //日志等级size_t _line; //行号std::thread::id _tid; //线程idstd::string _file; //文件名std::string _logger; //日志器名称std::string _payload; //有效消息处理//对应的构造函数LogMsg(LogLevel::value level,size_t line,std::string file,std::string logger,std::string msg):_ctime(util::Date::now()),_level(level),_line(line),_tid(std::this_thread::get_id()),_file(file),_logger(logger),_payload(msg){}};}#endif到这本篇博客的内容就到此结束了。 如果觉得本篇博客内容对你有所帮助的话可以点赞收藏顺便关注一下 如果文章内容有错误欢迎在评论区指正
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/90469.shtml
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!