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

2020给个免费网站好人有好报玛卡

2020给个免费网站好人有好报,玛卡,专门做辅助的扎金花网站,快推达seo文章目录 专栏导读日志宏&全局接口设计全局接口测试项目目录结构整理示例代码拓展示例代码 专栏导读 🌸作者简介:花想云 ,在读本科生一枚,C/C领域新星创作者,新星计划导师,阿里云专家博主,C…

文章目录

  • 专栏导读
  • 日志宏&全局接口设计
  • 全局接口测试
  • 项目目录结构整理
  • 示例代码
    • 拓展示例代码

专栏导读

🌸作者简介:花想云 ,在读本科生一枚,C/C++领域新星创作者,新星计划导师,阿里云专家博主,CSDN内容合伙人…致力于 C/C++、Linux 学习。

🌸专栏简介:本文收录于 C++项目——基于多设计模式下的同步与异步日志系统

🌸相关专栏推荐:C语言初阶系列C语言进阶系列C++系列数据结构与算法Linux

在这里插入图片描述

日志宏&全局接口设计

本章我们将完成提供全局接口&宏函数,对日志系统接口进行使用便捷性优化(避免用户自己创建单例)。

设计思想:

  • 提供获取指定日志器的全局接口(避免用户自己操作单例对象);
  • 使用宏函数对日志器的接口进行代理(代理模式);
  • 提供宏函数,直接通过默认日志器进行日志的标准输出打印(省去获取日志器的操作);
#ifndef __MY_LOG__
#define __MY_LOG__
#include "logger.hpp"namespace LOG
{// 1.提供获取指定日志器的全局接口(避免用户自己操作单例对象)Logger::ptr getLogger(const std::string &name){return LOG::LoggerManager::getInstance().getLogger(name);}Logger::ptr rootLogger(){return LOG::LoggerManager::getInstance().rootLogger();}// 2.实用宏函数对日志器的接口进行代理(代理模式)#define debug(fmt, ...) debug(__FILE__, __LINE__, fmt, ##__VA_ARGS__)#define info(fmt, ...) info(__FILE__, __LINE__, fmt, ##__VA_ARGS__)#define warn(fmt, ...) warn(__FILE__, __LINE__, fmt, ##__VA_ARGS__)#define error(fmt, ...) error(__FILE__, __LINE__, fmt, ##__VA_ARGS__)#define fatal(fmt, ...) fatal(__FILE__, __LINE__, fmt, ##__VA_ARGS__)// 3.提供宏函数,直接通过默认日志器进行日志的标准输出打印#define DEBUG(fmt, ...) LOG::rootLogger()->debug(fmt, ##__VA_ARGS__)#define INFO(fmt, ...) LOG::rootLogger()->info(fmt, ##__VA_ARGS__)#define WARN(fmt, ...) LOG::rootLogger()->warn(fmt, ##__VA_ARGS__)#define ERROR(fmt, ...) LOG::rootLogger()->error(fmt, ##__VA_ARGS__)#define FATAL(fmt, ...) LOG::rootLogger()->fatal(fmt, ##__VA_ARGS__)}
#endif

全局接口测试

测试代码

void log_test()
{DEBUG("%s", "测试日志");INFO("%s", "测试日志");WARN("%s", "测试日志");ERROR("%s", "测试日志");FATAL("%s", "测试日志");size_t count = 0;while(count < 300000){FATAL("测试日志-%d", count++);}
}
int main()
{log_test();return 0;
}

项目目录结构整理

在这里插入图片描述

示例代码

// example/test.cc
#include "../logs/log.h"
#include <unistd.h>void log_test(const std::string& name)
{INFO("%s", "测试开始");LOG::Logger::ptr logger = LOG::LoggerManager::getInstance().getLogger("async_logger");logger->debug(__FILE__, __LINE__, "%s", "测试日志");logger->info(__FILE__, __LINE__, "%s", "测试日志");logger->warn(__FILE__, __LINE__, "%s", "测试日志");logger->error(__FILE__, __LINE__, "%s", "测试日志");logger->fatal(__FILE__, __LINE__, "%s", "测试日志");INFO("%s", "测试完毕");
}
int main()
{std::unique_ptr<LOG::LoggerBuilder> builder(new LOG::GlobalLoggerBuilder());builder->buildLoggerName("async_logger");builder->buildLoggerLevel(LOG::LogLevel::value::WARN);builder->buildFormatter("[%c][%f:%l]%m%n");builder->buildLoggerType(LOG::LoggerType::LOGGER_ASYNC);builder->buildSink<LOG::FileSink>("./logfile/async.log");builder->buildSink<LOG::StdOutSink>();builder->buildSink<LOG::RollBySizeSink>("./logfile/roll-async-by-size", 1024 * 1024);builder->build();log_test("async_logger");return 0;
}

拓展示例代码

// extent/test.cc
#include "../logs/log.h"
#include <unistd.h>enum class TimeGap
{GAP_SECOND,GAP_MINUTE,GAP_HOUR,GAP_DAY
};
class RollByTimeSink : public LOG::LogSink
{
public:// 构造时传入文件名,并打开文件,将操作句柄管理起来RollByTimeSink(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;}_cur_gap = _gap_size == 1? LOG::util::Date::getTime() : LOG::util::Date::getTime() % _gap_size; // 获取当前是第几个时间段std::string filename = createNewFile();LOG::util::File::createDirectory(LOG::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 cur = LOG::util::Date::getTime();if((cur % _gap_size) != _cur_gap){_ofs.close();std::string filename = createNewFile();_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 = LOG::util::Date::getTime();struct tm lt;localtime_r(&t, &lt);std::stringstream filename;filename << _basename;filename << lt.tm_year + 1900;filename << lt.tm_mon + 1;filename << lt.tm_mday;filename << lt.tm_hour;filename << lt.tm_min;filename << lt.tm_sec;filename << "-";filename << ".log";return filename.str();}
private:std::string _basename;size_t _gap_size; // 时间段的大小int _cur_gap; // 当前是第几个时间段std::ofstream _ofs;
};int main()
{std::unique_ptr<LOG::LoggerBuilder> builder(new LOG::GlobalLoggerBuilder());builder->buildLoggerName("async_logger");builder->buildLoggerLevel(LOG::LogLevel::value::WARN);builder->buildFormatter("[%c][%f:%l]%m%n");builder->buildLoggerType(LOG::LoggerType::LOGGER_ASYNC);builder->buildSink<LOG::FileSink>("./logfile/async.log");builder->buildSink<LOG::StdOutSink>();builder->buildSink<RollByTimeSink>("./logfile/roll-async-by-time", TimeGap::GAP_SECOND);LOG::Logger::ptr logger = builder->build();size_t cur = LOG::util::Date::getTime();while(LOG::util::Date::getTime() < cur + 5){logger->fatal("这是一条测试日志");}return 0;
}

在这里插入图片描述

http://www.yayakq.cn/news/92113/

相关文章:

  • 微信公众平台小程序在哪南昌官网seo
  • 网站建设制作网络营销公司html5自建网站
  • 网站集约化建设什么意思网站内链建设的方法
  • 网站网页制作电话建设银行快审额度查询网站
  • 用python做的大型网站广西建设网站官网
  • 网站建设移交确认书大连甘井子区教育公共服务平台
  • 做汽车网站销售怎么入手开个网站多少钱一年
  • 做网站网页的成本成都知名建筑公司排名
  • flash网站模板源码网站中的搜索框图标怎么做的
  • 深圳自己做网站 服务器wordpress投稿编辑器
  • 深圳制作网站建设域名到期网站
  • sem和网站建设的关系永久 终身 云服务器
  • 如何免费建立个人网站北京做网站哪里好
  • 网页网站培训班html5购物网站
  • 网站编辑培训学校碳晶板全屋装修的利和弊
  • 培训公司网站建设外包网页
  • 广州 骏域网站建设专家优化方案怎么写
  • 做网站什么程序计算机软件开发规范1988作废
  • 学校学院网站建设意义猪八戒网做网站
  • 网站推广策略包括哪些内容邯郸哪里可以学建网站
  • 网站建设基础 ppt白云区专业网站建设
  • 山东住房和城乡建设厅网站上海外贸网站建
  • 如何做自己的网站商城开发网站教程
  • 网站防采集建网站不想用怎样撤销
  • 建设电影网站论文wordpress上传七牛
  • 植物网站模板网站开发都需要什么
  • 做网站的公司怎么拓展业务做网站哪种字体好看
  • 怎么看别人网站怎么做的优化蓬莱建网站
  • 太原网站开发工程师wordpress 配置数据库
  • 质感网站系统下载 锐狐青岛建设银行网站首页