首页 > 其他分享 >项目日志——日志器模块的扩展,建造者类的设计、实现、测试

项目日志——日志器模块的扩展,建造者类的设计、实现、测试

时间:2024-09-11 18:53:35浏览次数:13  
标签:__ 测试 builder 建造 模块 str 日志 logger

文章目录

建造者模式

建造者模式就是为了方便对象的构造,当零部件的构建和组装过于复杂时,就需要建造者模式来帮帮忙

这里我们的日志器很适合,但是也没有特别复杂,所以可以对整个设计模式进行简化,不需要指挥者,直接使用建造者进行组装

因为指挥者主要是为了各个零件构造的顺序而存在的,但是我们这里不需要规定顺序

设计

  1. 抽象日志器建造者类
    1. 设置日志器类型
    2. 将不同类型的日志器类型放在同一个日志器建造者类去完成
  2. 派生出具体的建造者
    1. 局部日志器建造者
    2. 全局日志器建造者(单例管理)

实现

// 使用建造者模式建造日志器,无需用户构造
    enum class LoggerType
    {
        LOGGER_SYNC,
        LOGGER_ASYNC
    };
    class LoggerBuilder
    {
    public:
        LoggerBuilder()
            : _logger_type(LoggerType::LOGGER_SYNC), _limit_level(LogLevel::value::DEBUG)
        {
        }
        void buildLoggerType(LoggerType type)
        {
            _logger_type = type;
        }
        void buildLoggerName(const std::string &name)
        {
            _logger_name = name;
        }
        void buildLoggerLevel(LogLevel::value level)
        {
            _limit_level = level;
        }
        void buildFormatter(const std::string &pattern = "[%d{%y-%m-%d|%H:%M:%S}][%t][%c][%f:%l][%p]%T%m%n")
        {
            _formatter = std::make_shared<Formatter>(pattern);
        }
        template <typename SinkType, typename... Args>
        void buildSink(Args &&...args)
        {
            LogSink::ptr psink = SinkFactory::create<SinkType>(std::forward<Args>(args)...);
            _sinks.push_back(psink);
        }
        virtual Logger::ptr build() = 0;

    protected:
        LoggerType _logger_type;
        std::string _logger_name;
        LogLevel::value _limit_level;
        Formatter::ptr _formatter;
        std::vector<LogSink::ptr> _sinks;
    };

    // 局部日志器建造者
    class LocalLoggerBuild : public LoggerBuilder
    {
    public:
        Logger::ptr build() override
        {
            assert(!_logger_name.empty());
            if (_sinks.empty())
            {
                buildSink<StdoutSink>();
            }
            if (_logger_type == LoggerType::LOGGER_ASYNC)
            {
            }

            return std::make_shared<SyncLogger>(_logger_name, _limit_level, _formatter, _sinks);
        }
    };

    // TODO 全局日志器建造者

测试

    // 测试建造者模式
    std::unique_ptr<Xulog::LoggerBuilder> builder(new Xulog::LocalLoggerBuild());
    builder->buildLoggerLevel(Xulog::LogLevel::value::WARN);
    builder->buildLoggerName("synclog");
    builder->buildFormatter();
    builder->buildLoggerType(Xulog::LoggerType::LOGGER_SYNC);
    builder->buildSink<Xulog::StdoutSink>();
    builder->buildSink<Xulog::FileSink>("./log/test.log");
    builder->buildSink<Xulog::RollSinkBySize>("./log/roll-", 1024 * 1024);
    builder->buildSink<RollSinkByTime>("./log/roll-", TimeGap::GAP_SECOND);
    Xulog::Logger::ptr logger = builder->build();

    std::string str = "测试同步日志器-";

    logger->debug(__FILE__, __LINE__, "%s", str.c_str());
    logger->error(__FILE__, __LINE__, "%s", str.c_str());
    logger->fatal(__FILE__, __LINE__, "%s", str.c_str());
    logger->info(__FILE__, __LINE__, "%s", str.c_str());
    logger->warn(__FILE__, __LINE__, "%s", str.c_str());

    size_t size = 0;
    int cnt = 1;

    while (size < 1024 * 1024 * 10) // 10 个
    {
        logger->fatal(__FILE__, __LINE__, "%s-%d", str.c_str(), cnt++);
        size += 20;
    }

标签:__,测试,builder,建造,模块,str,日志,logger
From: https://blog.csdn.net/ye_yumo/article/details/142142452

相关文章

  • C++ 虚析构函数简单测试
    classBase{public:virtual~Base(){cout<<"~Base"<<'\n';}};classDerived:publicBase{public:~Derived(){cout<<"~Derived"<<'\n';}};intmain(){{......
  • 2024/9/11日 日志
    今天学习了离散数学集合的部分内容,并初步认识了数据结构中影响程序的时空,即时间复杂度和空间复杂度。对时间复杂度的计算有了掌握和了解。即1.用常数1取代运行时间中的所有加法常数。2.在修改后的运行次数函数中,只保留最高阶次。3.如果最高阶项存在且不是1,则取出与这个项......
  • Logstash 配置Java日志格式的方法
    Logstash是用于日志收集的开源工具,通常与Elasticsearch和Kibana一起使用,形成ELKStack(现在称为ElasticStack)。Logstash非常灵活,可以通过配置文件(通常是.conf文件)来定义数据的输入、处理和输出。对于处理Java日志,一个常见的场景是解析Java应用生成的日志文件(如使用......
  • Rickdiculously Easy靶场渗透测试
    靶机下载地址https://www.vulnhub.com/entry/rickdiculouslyeasy-1,207/一.信息收集1.端口扫描nmap172.16.1.20-p--sV 发现还扫描出一个flag2.目录扫描二.获取shell和提权1、访问靶机IP地址2、拼接并访问robots.txt文件3、逐个访问,发现cgi-bin/tracertool......
  • 脂肪秤方案以CSU18M91四电极测脂模块开发
    一台脂肪秤通过测试体重、体脂、BMI、水分等数据并给出相应提示,并且许多人都将体脂检测数据作为身体健康指数衡量标准,辅助用户来关注身体健康,同时可以通过蓝牙与手机APP应用相连,记录日常身体变化情况,根据变化情况推荐用户饮食计划+运动计划。人体脂肪秤的原理是肌肉内含......
  • 软件测试学习笔记丨Docker 安装、管理、搭建服务
    本文转自测试人社区,原文链接:https://ceshiren.com/t/topic/32192容器(Docker)技术的价值保证环境一致性,只要使用相同镜像部署就可以保证一致性。轻量级虚拟化访问,运行更快,资源更小。同时也可以荣期间的隔离性。封装部署的负载型,云原生与微服务的首选技术方案。未来测试人员必学的技术......
  • 脂肪秤方案以CSU18M91四电极测脂模块开发
    一台脂肪秤通过测试体重、体脂、BMI、水分等数据并给出相应提示,并且许多人都将体脂检测数据作为身体健康指数衡量标准,辅助用户来关注身体健康,同时可以通过蓝牙与手机APP应用相连,记录日常身体变化情况,根据变化情况推荐用户饮食计划+运动计划。人体脂肪秤的原理是肌肉内含有较多血液......
  • 【硬件模块】DS18B20温度传感器
    DS18B20是只需要一根通讯线的温度传感器。首先先看看它的通信时序,一共就仨,初始化时序,写时序,读时序。第一个,初始化时序,我们(MCU)先拉低总线最少480us,然后释放总线(拉高)。DS18B20收到上升沿之后会在15~60us之后把总线拉低,拉低60~240us之后再释放总线。这样一套流程下来我们就......
  • logging模块用于记录日志的标准库
    日志级别是监控和调试软件系统的关键组成部分,它们帮助开发者和运维人员区分不同严重程度的信息,从而更有效地响应和解决问题。以下是日志级别的详细说明及如何在Python中使用它们的示例。日志级别分类日志级别按严重程度从低到高排序如下:DEBUG:用于记录详细的调试信息,通常在开......
  • 封装日志工具
    初始化日志记录器:通过传入domain和prefix创建日志记录器实例。日志输出方法:提供debug、info、warn和error四个方法,分别用于记录不同级别的日志信息。每个方法接收可变数量的字符串参数,并使用hilog库进行日志记录。import{hilog}from'@kit.PerformanceAnalysisKit'//......