当前位置: 首页 > news >正文

开源 wordpress 主题沧州网站建设优化

开源 wordpress 主题,沧州网站建设优化,企业宣传册一般分几个模块,如何查看网站的空间大小#x1f4dd;前言#xff1a; 这篇文章我们来讲讲Linux——基于策略模式的简单日志设计 #x1f3ac;个人简介#xff1a;努力学习ing #x1f4cb;个人专栏#xff1a;Linux #x1f380;CSDN主页 愚润求学 #x1f304;其他专栏#xff1a;C学习笔记#xff0c;C语…前言 这篇文章我们来讲讲Linux——基于策略模式的简单日志设计 个人简介努力学习ing 个人专栏Linux CSDN主页 愚润求学 其他专栏C学习笔记C语言入门基础python入门基础C刷题专栏 这里写目录标题 一认识日志二日志设计1. 总体概述2. Mylog.hpp3. Main.cpp 4. 运行效果 一认识日志 的日志是记录系统和软件运行中发生事件的文件主要作用是监控运行状态、记录异常信息帮助快速定位问题并支持程序员进行问题修复。它是系统维护、故障排查和安全管理的重要工具。 日志格式中通常包括时间戳、日志等级、日志内容 还可能包括、文件名、行号、进程线程相关id信息等 尽管复制已经有了大佬写好的现成的东西但是本文还是采用设计模式- 略模式来进行一个简单日志的设计 格式要求 [时间] [⽇志等级] [进程pid] [对应⽇志的⽂件名][⾏号] - 消息内容(⽀持可变参数)二日志设计 1. 总体概述 我们的日志的关键设计包括以下两点 根据不同的策略把日志内容输出到不同的“文件” 显示器文件log.txt日志文件 形成一条完整的日志内容 时间的获取日志等级的设计进程PID日志文件名和行号消息内容的“插入”插入日志信息的string里同时要支持可变参数的插入 2. Mylog.hpp 我们主要设计以下几个类 LogStrategy策略模式基类里面提供刷新方式SyncLog的“标准”需要子类继承并重新给刷新方法实现多态 子类1 ScreenLogStrategy 往显示器上刷新子类2 FileLogStrategy 往log文件里面刷新 Log日志主体我们要实现的就是以后log 日志内容就能写入日志 内部类LogMessage采用RAII的设计思想通过生命周期来控制日志内容的“写入”构造和“刷新”析构 以下是具体的代码 #pragma once #include sstream #include fstream #include iostream #include string #include thread #include mutex #include memory #include ctime #include sys/types.h #include unistd.h #include filesystem // C17的文件库, 需要⾼版本编译器和-stdc17#define FILEPATH ./log/ #define FILENAME log.txtnamespace tr {// 枚举类型设置日志等级enum class LogLevel{DEBUG,INFO,WARNING,ERROR,FATAL};std::string Level2String(LogLevel loglevel){switch (loglevel){// C11后枚举类有严格的作用域这里要指明是LogLevel::case LogLevel::DEBUG:return DEBUG;case LogLevel::INFO:return INFO;case LogLevel::WARNING:return WARNING;case LogLevel::ERROR:return ERROR;case LogLevel::FATAL:return FATAL;default:return UNKNOWN;}}// 策略模式// 基类class LogStrategy{public:virtual ~LogStrategy() default;virtual void SyncLog(std::string message) 0;};// 策略 1: 刷新到屏幕上class ScreenLogStrategy : public LogStrategy{public:void SyncLog(std::string message) override{_mutex.lock();std::cerr message std::endl; // 打印到 cerr 上可以立即刷新_mutex.unlock();}~ScreenLogStrategy(){std::cout ~ScreenLogStrategy() \n;}private:std::mutex _mutex; // 用 C 的锁对象};// 策略 2: 刷新到日志文件中class FileLogStrategy : public LogStrategy{public:FileLogStrategy(const std::string logpath ./, const std::string logname log.txt): _logpath(logpath),_logname(logname){if (std::filesystem::exists(_logpath))return;try{std::filesystem::create_directories(_logpath); // 如果抛异常抛的是const std::exception 类型的}catch (const std::exception e) // 用基类捕获所有异常{std::cerr e.what() \n;}}void SyncLog(std::string message) override{_mutex.lock();std::string logfile _logpath _logname;std::ofstream outfile(logfile, std::ios_base::out | std::ios_base::app); // 文件不存在会创建if (!outfile.is_open())return;outfile message \n;_mutex.unlock();}private:std::string _logpath;std::string _logname;std::mutex _mutex;};// 日志主体class Log{public:Log(){UseScreenLogStrategy(); // 默认使用策略 1}~Log(){}void UseScreenLogStrategy(){_logstrategy std::make_uniqueScreenLogStrategy();}void UseFileLogStrategy(){_logstrategy std::make_uniqueFileLogStrategy();}// 日志信息内置类// 为了后续实现 Mylog 的 operator() 重载的时候返回临时变量// 然后利用临时变量的每行生命周期来实现 logmessage 的刷新class LogMessage{public:LogMessage(LogLevel type, std::string filename, int line, Log loger): _level(type),_pid(getpid()),_filename(filename),_time(GetTime()),_line(line),_loger(loger){std::stringstream ss;ss [ _time ] [ Level2String(_level) ] [ _pid ] [ _filename ] [ _line ];_loginfo ss.str(); // 日志的左半部分}~LogMessage() // 生命周期结束刷新日志{if(_loger._logstrategy)_loger._logstrategy-SyncLog(_loginfo);}std::string GetTime(){time_t tm time(nullptr); // 时间戳struct tm curr;localtime_r(tm, curr); // 传入时间戳会输出一个 struct tm 里面记录着时间char timebuffer[64]; // 用来保存格式化后的时间信息snprintf(timebuffer, sizeof(timebuffer), %4d-%02d-%02d %02d:%02d:%02d,curr.tm_year 1900,curr.tm_mon,curr.tm_mday,curr.tm_hour,curr.tm_min,curr.tm_sec);return timebuffer;}// 重载流插入为了让 Log 能支持// 底层是将插入的日志的右半部分信息添加到 _loginfotemplate typename TLogMessage operator(const T info){std::string ss info;_loginfo ss; //return *this; // 返回自己实现多次 }private:LogLevel _level;pid_t _pid;std::string _filename;std::string _time;int _line;std::string _loginfo; // 整条日志信息Log _loger; // 外部类对象用来调用刷新};// Log 的仿函数特意返回临时变量// 利用 RAII 的设计特点创建一个LogMessage临时对象// 在构造的时候准备好左半部分 在 的时候准备好 右半部分最后在该行结束时生命周期结束刷新日志LogMessage operator()(LogLevel level, std::string filename, int line){return LogMessage(level, filename, line, *this);}private:std::unique_ptrLogStrategy _logstrategy;};Log logger; // 定义全局对象// 使⽤宏可以进⾏代码插⼊⽅便随时获取⽂件名和⾏号#define LOG(type) logger(type, __FILE__, __LINE__) // __FILE__ 和 __LINE__ 可以自动获取文件名和行号// 提供选择使⽤何种日志策略的⽅法#define ENABLE_CONSOLE_LOG_STRATEGY() logger.UseScreenLogStrategy()#define ENABLE_FILE_LOG_STRATEGY() logger.UseFileLogStrategy() }3. Main.cpp 测试代码 #include Mylog.hppusing namespace tr; int main() {// ENABLE_CONSOLE_LOG_STRATEGY();ENABLE_FILE_LOG_STRATEGY();LOG(LogLevel::DEBUG) hello world;LOG(LogLevel::ERROR) hello world;LOG(LogLevel::FATAL) hello world;LOG(LogLevel::INFO) hello world;LOG(LogLevel::INFO) hello world;return 0; }ENABLE_CONSOLE_LOG_STRATEGY()选择往屏幕刷新的策略ENABLE_FILE_LOG_STRATEGY()选择往文件里面刷新 4. 运行效果 我的分享也就到此结束啦 要是我的分享也能对你的学习起到帮助那简直是太酷啦 若有不足还请大家多多指正我们一起学习交流 公主王子点赞→收藏⭐→关注 感谢大家的观看和支持祝大家都能得偿所愿天天开心
http://www.hkea.cn/news/14560170/

相关文章:

  • 安徽 网站信息内容建设wordpress添加侧栏
  • 哪些网站容易被百度收录昆明平台开发公司
  • iis 发布网站 500在线qq登录无需下载
  • 网站服务器租赁费用wordpress和vue哪个好
  • wordpress 中文安装河北网站优化建设
  • 沈阳做网站优化的公司关键词查询网
  • 建设网站查询余额做网站端口映射
  • 贵阳网站开发培训重庆网站建设 渝
  • 建设网站工作室的问题疑问网页界面设计的特点在于
  • wordpress 电影解析佛山网站优化怎么做
  • 柳州企业网站开发公司网站开发要什么基础
  • 建设银行官网首页网站招聘企业网站添加栏目
  • 做网站怎么跑业务做详情页的网站
  • 广州好的做网站公司仿牌网站 域名注册
  • 外贸网站源码php如何做视频网站旗下账号
  • 电子商务网站建设与维护试题深圳市seo上词点击软件
  • 电子商务企业网站策划设计找版面网站
  • 网站的建设目标文档深圳软件培训机构名单
  • 锐酷网站建设教程网页设计教程免费下载
  • 长沙教育网站开发网站建设为大学生服务
  • 做网站一般长宽多少钱开发小程序需要哪些技术
  • 德州网站制作建设网站经验
  • 企业展示网站模板免费下载.net微信网站开发
  • 海淀区企业网站建设域名备案好了怎么建设网站
  • 百色建设网站网站建设资金管理办法
  • 网站审核备案 几天什么平台可以发网推广
  • php网站开发实例教程第七章房地产网站建设策划书
  • 制作网站注册页面wordpress怎么做采集
  • 建设一个网站的费用四川成都装修公司排名
  • 建德建设局官方网站王烨张开