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

给军方做网站套模板行不行地税局网站怎么做变更

给军方做网站套模板行不行,地税局网站怎么做变更,网站建设公司广告 晴天娃娃,太原seo网络推广平台文章目录 日志落地模块设计实现扩展实现测试 日志落地模块 设计 功能是,将格式化完成后的日志消息字符串,输出到指定的位置 支持将日志落地到不同的位置 标准输出指定文件滚动文件 滚动文件按照时间或者大小进行滚动切换,可以按照天数对…

文章目录

    • 日志落地模块
      • 设计
      • 实现
      • 扩展实现
      • 测试

日志落地模块

设计

功能是,将格式化完成后的日志消息字符串,输出到指定的位置

支持将日志落地到不同的位置

  • 标准输出
  • 指定文件
  • 滚动文件

滚动文件按照时间或者大小进行滚动切换,可以按照天数对日志信息进行管理

我们这里实现按照大小进行滚动文件的设计

同时也是支持落地方向的扩展,可以写入到云服务器或者数据库中

用户可以自己编写一个新的日志落地模块进行实现,因此需要设计一个简单工厂模式进行管理

实现思想是这样的

  1. 抽象出落地模块的基类
  2. 派生出不同落地方向的子类
  3. 使用工厂模式进行创建和表示的分离,便于对象的扩展

实现

/*日志落地模块的实现1. 抽象落地基类2. 派生子类3. 使用工厂模式进行创建与表示的分离
*/
#pragma once
#include "util.hpp"
#include <memory>
#include <fstream>
#include <cassert>
#include <sstream>namespace Xulog
{class LogSink{public:using ptr = std::shared_ptr<LogSink>;LogSink() {}virtual ~LogSink() {}virtual void log(const char *data, size_t len) = 0;};// 标准输出class StdoutSink : public LogSink{public:// 日志写入到标准输出void log(const char *data, size_t len){std::cout.write(data, len);}};// 指定文件class FileSink : public LogSink{public:// 传入文件名时,构造并打开文件,将操作句柄管理起来FileSink(const std::string &pathname): _pathname(pathname){Util::File::createDirectory(Util::File::path(_pathname)); // 创建目录_ofs.open(_pathname, std::ios::binary | std::ios::app);   // 打开文件assert(_ofs.is_open());}void log(const char *data, size_t len){_ofs.write(data, len);assert(_ofs.good());}private:std::string _pathname;std::ofstream _ofs;};// 滚动文件(大小)class RollSinkBySize : public LogSink{public:RollSinkBySize(const std::string &basename, size_t max_size): _basename(basename), _max_fsize(max_size), _current_fsize(0), _cnt(0){std::string pathname = creatNewFIle();Util::File::createDirectory(Util::File::path(pathname)); // 创建目录_ofs.open(pathname, std::ios::binary | std::ios::app);assert(_ofs.is_open());}void log(const char *data, size_t len){if (_current_fsize >= _max_fsize){std::string pathname = creatNewFIle();_ofs.close(); // 关闭原来已经打开的文件_ofs.open(pathname, std::ios::binary | std::ios::app);assert(_ofs.is_open());_current_fsize = 0;// _cnt = 0;}_ofs.write(data, len);assert(_ofs.good());_current_fsize += len;}private:std::string creatNewFIle() // 大小判断,超过则创建新文件{// 获取系统时间,构造文件扩展名time_t t = Util::Date::getTime();struct tm lt;localtime_r(&t, &lt);std::stringstream filename;filename << _basename << lt.tm_year + 1900 << lt.tm_mon + 1 << lt.tm_mday << lt.tm_hour << lt.tm_min << lt.tm_sec << "-" << _cnt++ << ".log";return filename.str();}private:std::string _basename; // 基础文件名 (+扩展文件名-时间|计数器)std::ofstream _ofs;size_t _max_fsize;     // 大小上限size_t _current_fsize; // 当前大小size_t _cnt;           // 日志数量};// 简单工厂模式class SinkFactory{public:template <typename SinkType, typename... Args>static LogSink::ptr create(Args &&...args){return std::make_shared<SinkType>(std::forward<Args>(args)...);}};
}

扩展实现

// 扩展测试: 滚动文件(时间)
// 1. 以时间段滚动
// 2. time(nullptr)%gap;
enum class TimeGap
{GAP_SECOND,GAP_MINUTE,GAP_HOUR,GAP_DAY
};
class RollSinkByTime : public Xulog::LogSink
{
public:// 传入文件名时,构造并打开文件,将操作句柄管理起来RollSinkByTime(const std::string &basename, TimeGap gap_type): _basename(basename){switch (gap_type){case TimeGap::GAP_SECOND:_gap_size = 1;break;case TimeGap::GAP_MINUTE:_gap_size = 60;break;case TimeGap::GAP_HOUR:_gap_size = 3600;break;case TimeGap::GAP_DAY:_gap_size = 3600 * 24;break;}_current_gap = _gap_size == 1 ? Xulog::Util::Date::getTime() : (Xulog::Util::Date::getTime() % _gap_size);std::string filename = createNewFile();Xulog::Util::File::createDirectory(Xulog::Util::File::path(filename)); // 创建目录_ofs.open(filename, std::ios::binary | std::ios::app);assert(_ofs.is_open());}void log(const char *data, size_t len){time_t current = Xulog::Util::Date::getTime();if (current % _gap_size != _current_gap){std::string filename = createNewFile();_ofs.close();_ofs.open(filename, std::ios::binary | std::ios::app);assert(_ofs.is_open());}_ofs.write(data, len);assert(_ofs.good());}private:std::string createNewFile(){time_t t = Xulog::Util::Date::getTime();struct tm lt;localtime_r(&t, &lt);std::stringstream filename;filename << _basename << lt.tm_year + 1900 << lt.tm_mon + 1 << lt.tm_mday << lt.tm_hour << lt.tm_min << lt.tm_sec << ".log";return filename.str();}private:std::string _basename;std::ofstream _ofs;size_t _current_gap; // 当前时间段的个数size_t _gap_size;    // 间隔大小
};

测试

    Xulog::LogMsg msg(Xulog::LogLevel::value::ERROR, 124, "main.cc", "root", "格式化功能测试");Xulog::Formatter fmt1;std::string str1 = fmt1.Format(msg);// 测试原生日志落地模块Xulog::LogSink::ptr std_lsp = Xulog::SinkFactory::create<Xulog::StdoutSink>();Xulog::LogSink::ptr file_lsp = Xulog::SinkFactory::create<Xulog::FileSink>("./log/test.log");Xulog::LogSink::ptr roll_lsp = Xulog::SinkFactory::create<Xulog::RollSinkBySize>("./log/roll-", 1024 * 1024); // 每个文件1MBXulog::LogSink::ptr time_lsp = Xulog::SinkFactory::create<RollSinkByTime>("./log/roll-", TimeGap::GAP_SECOND); // 每个文件1sstd_lsp->log(str1.c_str(), str1.size());file_lsp->log(str1.c_str(), str1.size());size_t size = 0;size_t cnt = 0;while (size < 1024 * 1024 * 100) // 100 个{std::string tmp = std::to_string(cnt++);tmp += str1;roll_lsp->log(tmp.c_str(), tmp.size());size += tmp.size();}time_t t = Xulog::Util::Date::getTime();while (Xulog::Util::Date::getTime() < t + 3){time_lsp->log(str1.c_str(), str1.size());}
http://www.yayakq.cn/news/413429/

相关文章:

  • 邯郸公司做网站山西网站建设免费
  • 杭州哪家网站建设好应用软件商店
  • seo建站教程工作室赚钱项目
  • 沈阳哪里有教做网站的做网站需要提供哪些信息
  • 做网站及小程序需要会哪些技能怎样防止别人利用自己的电脑做网站服务器
  • 深圳婚纱摄影网站建设中国软件外包网
  • 专做国际时事评论网站海淀区网站备案去哪
  • 布吉商城网站建设哪家便宜企业网站seo推广技巧
  • 网站建设服务器在国外如何打击邮箱账号做网站用户名好不好
  • 临翔网站建设自创网站
  • 2024全民核酸又开始了深圳seo排名哪家好
  • 海外学校网站建设贵州建设职业技术学院网站
  • 廊坊手机网站建设php做简单网站教程视频教程
  • 做网站的项目介绍网站建设实训周记
  • 南宁网站建设公司招聘温州专业微网站制作价格
  • 校园网站建设需求成都编程培训机构排名前十
  • 如何做免费域名网站建电影网站
  • 做儿童网站赚钱吗邯郸建设公司网站
  • 晨光文具店网站建设聚美优品网的网站建设情况
  • 外国人做数学视频网站WordPress底部设计
  • 帮中介做网站赚钱吗即墨哪里有做网站的
  • 简易的在线数据库网站模板下载苏州百度代理公司
  • 做网站的需要什么资质证明中山网站定制公司
  • 网站开发入哪个会计科目wordpress插件制作教程视频
  • 网站建设的缺陷cms 企业网站管理系统
  • 哪个网站可以做艺术字怎样在手机上做网站
  • 买的服务器做两个网站wordpress编辑器按钮
  • 常德建设网站网站建设素材使用应该注意什么
  • 常见的三种网站类型网站建设费分录
  • 没有网站可以备案吗广东省住房建设厅网站首页