高性能日志系统 代理模式构建全局日志器获取接口

日志器获取接口

通过两个函数,用于获取指定名称的日志器和root日志器。两个函数分别通过调用loggerManager的getInstance方法,获取单例的日志管理器对象,通过这种方式,借助日志管理器获取具体的日志器对象。

设计的主要目的,将日志器的获取与管理逻辑封装在LoggerMannner中,从而在调用的时候就不需要关注日志器的具体实现细节,只需要通过这个接口调用即可获取自己所需要的日志器。

cpp 复制代码
Logger::ptr getLogger(const std::string &name) {
    return loggerManager::getInstance().getLogger(name);
}
Logger::ptr rootLogger() {
    return loggerManager::getInstance().rootLogger();
}

宏定义代理模式

代理模式的三重封装

  • **LOGD宏:**记录调试级别的日志,将所有的日志记录工作代理交给LOG_DEBUG宏,同时指向使用root日志器
  • **LOG_DEBUG:**进一步封装日志记录的调用过程,该代理对具体日志器对象的debug方法进行调用
  • **logger->debug:**日志记录最终是日志器对象,debug方法执行,也就是具体实现日志输出的部分,用于处理格式化字符串并将日志消息记录到适当的输出地方
cpp 复制代码
    #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__)
    
    #define LOG_DEBUG(logger, fmt, ...) (logger)->debug(fmt, ##__VA_ARGS__)
    #define LOG_INFO(logger, fmt, ...) (logger)->info(fmt, ##__VA_ARGS__)
    #define LOG_WARN(logger, fmt, ...) (logger)->warn(fmt, ##__VA_ARGS__)
    #define LOG_ERROR(logger, fmt, ...) (logger)->error(fmt, ##__VA_ARGS__)
    #define LOG_FATAL(logger, fmt, ...) (logger)->fatal(fmt, ##__VA_ARGS__)

    #define LOGD(fmt, ...) LOG_DEBUG(maglog::rootLogger(), fmt, ##__VA_ARGS__)
    #define LOGI(fmt, ...) LOG_INFO(maglog::rootLogger(), fmt, ##__VA_ARGS__)
    #define LOGW(fmt, ...) LOG_WARN(maglog::rootLogger(), fmt, ##__VA_ARGS__)
    #define LOGE(fmt, ...) LOG_ERROR(maglog::rootLogger(), fmt, ##__VA_ARGS__)
    #define LOGF(fmt, ...) LOG_FATAL(maglog::rootLogger(), fmt, ##__VA_ARGS__)

使用测试

**简单功能性测试,**直接引用封装好日志头文件输出对应日志信息

  • 测试不同日志级别的日志信息
  • 对包含多个参数的格式化消息进行测试
cpp 复制代码
#include <iostream>
#include "maglog.h"

int main() {
    // 测试调试级别日志 (LOGD)
    LOGD("这是一条没有附加参数的调试消息。");
    LOGD("这是一条带有一个参数的调试消息: %d", 42);

    // 测试信息级别日志 (LOGI)
    LOGI("这是一条没有附加参数的信息消息。");
    LOGI("这是一条带有两个参数的信息消息: %d 和 %s", 100, "示例");

    // 测试警告级别日志 (LOGW)
    LOGW("这是一条警告消息。");
    LOGW("这是一条带有浮点数参数的警告消息: %.2f", 3.1415);

    // 测试错误级别日志 (LOGE)
    LOGE("这是一条错误消息。");
    LOGE("这是一条带有多个参数的错误消息: %s, %d, %.2f", "测试", 123, 45.67);

    // 测试致命错误级别日志 (LOGF)
    LOGF("这是一条致命错误消息。");
    LOGF("这是一条带有字符串参数的致命错误消息: %s", "严重故障");

    return 0;
}

**复杂测试:**不同日志级别在不同情况下触发,从而展示日志接口拓展性

cpp 复制代码
#include <iostream>
#include "maglog.h"

// 模拟的应用模块
namespace Application {

    void initialize() {
        LOGI("应用程序初始化开始。");
        // 假设这里有一些初始化代码
        LOGI("应用程序初始化完成。");
    }

    void loadData(int dataID) {
        LOGD("开始加载数据,数据ID: %d", dataID);

        // 模拟加载数据的过程
        if (dataID < 0) {
            LOGE("加载数据失败,数据ID无效: %d", dataID);
            return;
        }

        // 假设数据加载成功
        LOGI("数据加载成功,数据ID: %d", dataID);
    }

    void processData(int data) {
        LOGD("开始处理数据: %d", data);

        // 简单的模拟处理过程
        if (data == 0) {
            LOGW("处理的数据为0,这可能不是期望的结果。");
        }

        // 处理完成
        LOGI("数据处理完成: %d", data);
    }

    void terminate() {
        LOGI("应用程序即将终止。");
        // 假设这里有一些清理代码
        LOGI("应用程序终止完成。");
    }
}
相关推荐
矛取矛求2 小时前
Linux如何更优质调节系统性能
linux
李元豪3 小时前
【智鹿空间】c++实现了一个简单的链表数据结构 MyList,其中包含基本的 Get 和 Modify 操作,
数据结构·c++·链表
UestcXiye3 小时前
《TCP/IP网络编程》学习笔记 | Chapter 9:套接字的多种可选项
c++·计算机网络·ip·tcp
内核程序员kevin3 小时前
在Linux环境下使用Docker打包和发布.NET程序并配合MySQL部署
linux·mysql·docker·.net
kayotin4 小时前
Wordpress博客配置2024
linux·mysql·docker
一丝晨光4 小时前
编译器、IDE对C/C++新标准的支持
c语言·开发语言·c++·ide·msvc·visual studio·gcc
丶Darling.5 小时前
Day40 | 动态规划 :完全背包应用 组合总和IV(类比爬楼梯)
c++·算法·动态规划·记忆化搜索·回溯
Ztiddler5 小时前
【Linux Shell命令-不定期更新】
linux·运维·服务器·ssh
小小不董5 小时前
Oracle OCP认证考试考点详解082系列16
linux·运维·服务器·数据库·oracle·dba
奶味少女酱~5 小时前
常用的c++特性-->day02
开发语言·c++·算法