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

网站备案怎么做超链接云南网站建设快速优化

网站备案怎么做超链接,云南网站建设快速优化,重庆工程信息网查询,个人网站用react做日志的介绍 计算机中的日志是记录系统和软件运行中发送事件的文件,主要作用是监控运行状态、记录异常信息,帮助快速定位问题并支持程序员进行问题修复。它是系统维护、故障排查和安全管理的重要工具。 日志格式以下几个指标是必须得有的: •…

日志的介绍

计算机中的日志是记录系统和软件运行中发送事件的文件,主要作用是监控运行状态、记录异常信息,帮助快速定位问题并支持程序员进行问题修复。它是系统维护、故障排查和安全管理的重要工具。

日志格式以下几个指标是必须得有的:
• 时间戳
• 日志等级
• 日志内容
以下几个指标是可选的:
• 文件名
• 行号
• 进程与线程相关id信息

日志有现成的解决方案,如:spdlog、glog、Boost.Log、Log4cxx等等,我们依旧采用自定义日志的方式。
这里我们采用设计模式中的策略模式来进行日志的设计,我们想要的日志格式如下:

#[可读性很好的时间] [⽇志等级] [进程pid] [打印对应⽇志的文件名][行号] - 消息内容,支持可变参数
[2025-2-16 9:13:13] [DEBUG] [2422165] [Log.cc] [12] - hello world
[2025-2-16 9:13:13] [DEBUG] [2422165] [Log.cc] [13] - hello world
[2025-2-16 9:13:13] [DEBUG] [2422165] [Log.cc] [14] - hello world
[2025-2-16 9:13:13] [DEBUG] [2422165] [Log.cc] [16] - hello world
[2025-2-16 9:13:13] [DEBUG] [2422165] [Log.cc] [17] - hello world

所以我们想要实现的日志需要实现两个部分:日志信息的生成与落盘方式的构建(显示器or文件)。这里我们采用策略模式生成落盘方式,例用内部类生成信息,最终完成日志的输出。

日志的实现

#include <string>
#include <iostream>
#include <fstream>
#include <memory>
#include <ctime>
#include <sstream>
#include <filesystem>
#include <unistd.h>
#include "mutex.hpp"
namespace LogMudual
{using namespace std;using namespace MutexModel;//  默认路径和日志名称const string defaultpath = "./log/";const string defaultname = "log.txt";// 日志等级enum class LogLevel{DEBUG,INFO,WARNING,ERROR,FATAL};// 根据时间戳,获取可读性较强的时间信息string GetCurTime(){time_t tm = time(nullptr);struct tm curr;localtime_r(&tm, &curr);stringstream ss;ss << curr.tm_year + 1900 << "-"<< curr.tm_mon << "-"<< curr.tm_mday << " "<< curr.tm_hour << ":"<< curr.tm_min << ":"<< curr.tm_sec;return ss.str();}//将日志等级转成字符串string LogLevelToString(LogLevel level){switch (level){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(const string &message) = 0; // 不同模式的刷新方式};//落盘方式为显示器class ConsoleLogStrategy : public LogStrategy{public:virtual ~ConsoleLogStrategy(){}//重写虚函数void SyncLog(const string &message){LockGuard lock(_mutex);cout << message << endl;}private:Mutex _mutex;};//落盘方式为文件class FileLogStrategy : public LogStrategy{public:~FileLogStrategy(){}FileLogStrategy(const string &logpath = defaultpath, const string &logname = defaultname): _logpath(logpath), _logname(logname){LockGuard lock(_mutex);//应用C++17的接口完成文件操作if (std::filesystem::exists(_logpath))return;try{std::filesystem::create_directories(_logpath);}catch (const std::filesystem::filesystem_error &e){std::cerr << e.what() << '\n';}}//重写虚函数void SyncLog(const string &message){LockGuard lock(_mutex);string log = _logpath + _logname;ofstream out(log.c_str(), ios::app); // 追加⽅式if (!out.is_open())return;out << message << "\n";out.close();}private:Mutex _mutex;const string &_logpath;const string &_logname;};//日志类class Logger{public:Logger(){//默认落盘显示器UseConsoleStrategy();}void UseConsoleStrategy(){_strategy = make_unique<ConsoleLogStrategy>();}void UseFileLogStrategy(){_strategy = make_unique<FileLogStrategy>();}//内部类:日志信息class LogMessage{public:LogMessage(LogLevel type, string filename, int line, Logger &logger) : _type(type),_curr_time(GetCurTime()),_pid(getpid()),_filename(filename),_line(line),_logger(logger){//字符串流std::stringstream ssbuffer;ssbuffer << "[" << _curr_time << "] "<< "[" << LogLevelToString(type) << "] "<< "[" << _pid << "] "<< "[" << _filename << "] "<< "[" << _line << "]"<< " - ";_loginfo = ssbuffer.str();}//重载<<,完成自定义信息输出部分template <typename T>LogMessage &operator<<(const T &info){stringstream ssbuffer;ssbuffer << info;_loginfo += ssbuffer.str();return *this;}//刷新日志~LogMessage(){if (_logger._strategy){_logger._strategy->SyncLog(_loginfo);}}private:LogLevel _type;         // 日志等级std::string _curr_time; // 日志时间pid_t _pid;             // 写入日志的时间std::string _filename;  // 对应的文件名int _line;              // 对应的文件⾏号Logger &_logger;        // 引用外部logger类, ⽅便使用策略进行刷新std::string _loginfo;   // 一条合并完成的,完整的日志信息};//故意不带&,目的就是为了生成LogMessage对象,让它在析构时将日志信息刷新LogMessage operator()(LogLevel type, string filename, int line){return LogMessage(type, filename, line, *this);}~Logger(){}private:std::unique_ptr<LogStrategy> _strategy;//日志刷新的策略};Logger logger;//定义全局对象// 使用宏,可以进行代码插⼊,⽅便随时获取文件名和行号
#define LOG(type) logger(type, __FILE__, __LINE__)
// 提供选择使⽤何种日志策略的方法
#define ENABLE_CONSOLE_LOG_STRATEGY() logger.UseConsoleStrategy()
#define ENABLE_FILE_LOG_STRATEGY() logger.UseFileStrategy()
}
//test.cc
#include <iostream>
#include "Log.hpp"
using namespace LogMudual;int main()
{ENABLE_CONSOLE_LOG_STRATEGY();LOG(LogLevel::DEBUG) << "hello world";LOG(LogLevel::DEBUG) << "hello world";LOG(LogLevel::DEBUG) << "hello world";ENABLE_FILE_LOG_STRATEGY();LOG(LogLevel::DEBUG) << "hello world";LOG(LogLevel::DEBUG) << "hello world";LOG(LogLevel::WARNING) << "hello world";return 0;
}
http://www.dtcms.com/wzjs/462490.html

相关文章:

  • b2b免费发布企业网站大全2345浏览器网址
  • 网站pv是什么意思seo怎么才能优化好
  • 各行业网站建设方案书排名优化seo
  • 如东建设局网站域名注册商有哪些
  • 企业邮箱密码忘了怎么重置密码长沙谷歌seo
  • 校考前做试题的网站百度客服转人工
  • 后期网站建设及维护推广百度指数怎么查
  • 做tb任务赚钱的网站seo外链推广工具下载
  • typecho 和WordPress万秀服务不错的seo推广
  • 西安手机网站网络建站公司
  • wordpress 博客改成文章seo百度刷排名
  • 建网站不花钱免费最新搜索引擎排名
  • 营销型网站改版教育培训机构管理系统
  • 简单网站设计价格自己建网站怎么弄
  • 网站建设与制作考试题网络营销工作内容和职责
  • 西安网站设计学校品牌营销策划方案怎么做才好
  • 装饰工程公司经营范围包括哪些?英文关键词seo
  • 网站的分类有哪些内容公司宣传软文
  • 潍坊制作网站的公司代刷网站推广链接免费
  • 网站建设实训过程软文范例大全500字
  • 网站做推广要备案吗crm系统
  • gbk网站转utf8怎样免费建立自己的网站
  • 邵阳建设网站营销推广的作用
  • 做门户网站建设多少钱手机系统优化软件哪个好
  • 做网站的数据库网络事件营销案例
  • 加油优惠卡app软件开发宁波seo外包公司
  • 网站模板去哪要谷歌搜索引擎怎么才能用
  • 南京做网站哪家公司最好网站快速排名优化价格
  • 我自己做网站网络营销案例分享
  • 给政府做采购哪个网站平台海外推广是做什么的