• 基于log4cpp封装日志类


    一、log4cpp的使用

    1. 下载log4cpp

    log4cpp官方下载地址

    2. 安装log4cpp

    第一步:解压 tar zxvf log4cpp-1.1.4.tar.gz
    在这里插入图片描述

    第二步:进入log4cpp文件夹并执行 ./configure
    在这里插入图片描述

    tips:如果是ARM架构的芯片可能会失败,如下面这种情况,重新执行 ./configure --build=aarch64-unknown-linux-gnu 即可
    在这里插入图片描述

    第三步:执行 make
    第四步:执行 make check
    第五步:执行 make install

    3. 查看是否安装成功

    安装成功后,在/usr/local/include路径下会多一个log4cpp的文件夹
    在这里插入图片描述

    4. 更新动态库路径缓存

    !!! 不更新缓存,会导致编译时找不到库文件;请执行命令sudo ldconfig
    在这里插入图片描述

    5. 编写测试代码

    #include 
    #include 
    #include 
    #include 
    #include 
    
    using namespace std;
    using namespace log4cpp;
    
    int main(void) {
        OstreamAppender *osAppender = new OstreamAppender("console", &cout);
        osAppender->setLayout(new BasicLayout());
        Category &root = Category::getRoot();
        root.addAppender(osAppender);
        root.setPriority(Priority::DEBUG);
    
        root.error("this is a error");
        root.warn("this is a warn");
    
        root.shutdown();
        return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22

    6. 编译代码并运行测试

    g++ test.cc -llog4cpp
    在这里插入图片描述

    二、自定义封装的MyLogger类

    需要注意的坑: 由于__FILE__、__func____LINE__是编译器提供的预处理宏,它们是在预处理阶段就被替换掉了,如果不封装成宏函数会导致打印的行号等信息不准。

    #include 
    #include 
    #include 
    #include 
    #include 
    #include 
    #include 
    #include 
    
    using namespace std;
    using namespace log4cpp;
    
    // 定义拼接前缀函数
    #define ConcatPrefix(str) (                     \
        string("[").append(__FILE__).append(",")    \
        .append(__func__).append(",")               \
        .append(to_string(__LINE__)).append("]: ")  \
        .append(str) )
    
    // 定义LogWarn宏函数
    #define LogWarn(str) {                              \
        MyLogger *log = MyLogger::getInstance();        \
        log->warn(ConcatPrefix(str).c_str());           \
    }
    // 定义LogError宏函数
    #define LogError(str) {                             \
        MyLogger *log = MyLogger::getInstance();        \
        log->error(ConcatPrefix(str).c_str());          \
    }
    // 定义LogDebug宏函数
    #define LogDebug(str) {                             \
        MyLogger *log = MyLogger::getInstance();        \
        log->debug(ConcatPrefix(str).c_str());          \
    }
    // 定义LogInfo宏函数
    #define LogInfo(str) {                              \
        MyLogger *log = MyLogger::getInstance();        \
        log->info(ConcatPrefix(str).c_str());           \
    }
    
    
    class MyLogger
    {
    public:
        static MyLogger *getInstance();
        static void destroyInstance();
    	void warn(const char *msg);
    	void error(const char *msg);
    	void debug(const char *msg);
    	void info(const char *msg);
    	
    private:
    	MyLogger();
    	~MyLogger();
        Category &category;
        static MyLogger *pInstance;    
    };
    // 初始化静态对象
    MyLogger *MyLogger::pInstance = nullptr;
    // 无参构造函数
    MyLogger::MyLogger() :category(Category::getInstance("MyLogger")) {
        // 定义输出到命令行的Appender
        OstreamAppender *pConmandLineAppender = new OstreamAppender("comandLine", &cout); 
        // 定义输出到回卷文件的Appender
        RollingFileAppender *pRollingAppender = new RollingFileAppender("rollingFile", "mylogger.log", 1024, 3);
        // 定义日志样式
        PatternLayout *layout1 = new PatternLayout();
        layout1->setConversionPattern("%d [%p] %m%n");
        PatternLayout *layout2 = new PatternLayout();
        layout2->setConversionPattern("%d [%p] %m%n");
        // 绑定输出样式
        pConmandLineAppender->setLayout(layout1);
        pRollingAppender->setLayout(layout2); 
    
        // 设置日志过滤等级 
        category.setPriority(Priority::DEBUG);    
        // 设置输出位置
        category.setAppender(pConmandLineAppender);
        category.setAppender(pRollingAppender);
    }
    /**
     * 获取单例对象 
    */
    MyLogger *MyLogger::getInstance() {
        if (pInstance == nullptr) {
            pInstance = new MyLogger();
        }
        return pInstance;
    }
    /**
     * 销毁单例对象
    */
    void MyLogger::destroyInstance() {
        if (pInstance != nullptr) {
            delete pInstance;
            pInstance = nullptr;
        }
    }
    /**
     * 析构函数
    */
    MyLogger::~MyLogger() {
        category.shutdown();
        cout << "~MyLogger()" << endl;
    }
    /**
     * warn
    */
    void MyLogger::warn(const char *msg) {
        category.warn(msg);
    }
    /**
     * error
    */
    void MyLogger::error(const char *msg) {
        category.error(msg);
    }
    /**
     * debug
    */
    void MyLogger::debug(const char *msg) {
        category.debug(msg);
    }
    /**
     * info
    */
    void MyLogger::info(const char *msg) {
        category.info(msg);
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82
    • 83
    • 84
    • 85
    • 86
    • 87
    • 88
    • 89
    • 90
    • 91
    • 92
    • 93
    • 94
    • 95
    • 96
    • 97
    • 98
    • 99
    • 100
    • 101
    • 102
    • 103
    • 104
    • 105
    • 106
    • 107
    • 108
    • 109
    • 110
    • 111
    • 112
    • 113
    • 114
    • 115
    • 116
    • 117
    • 118
    • 119
    • 120
    • 121
    • 122
    • 123
    • 124
    • 125
    • 126
    • 127
    • 128
    • 129

    三、MyLogger的使用示例

    方式一:单例对象

    void test0()
    {
        MyLogger *log = MyLogger::getInstance();
        log->warn(ConcatPrefix("The log is warn message").c_str());
        log->error(ConcatPrefix("The log is error message").c_str());
        log->debug(ConcatPrefix("The log is debug message").c_str());
        log->info(ConcatPrefix("The log is info message").c_str());
        MyLogger::destroyInstance();
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    方式二:宏函数

    void test1() 
    {
        LogWarn("The log is warn message");
        LogError("The log is error message");
        LogDebug("The log is debug message");
        LogInfo("The log is info message");
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    生成效果:
    在这里插入图片描述

  • 相关阅读:
    如何在 Windows 10 中安装 Azure Data Studio 1.39.1
    VIT(Vision Transformer)学习(三)-纯VIT之swin transformer模型理解
    Educational Codeforces Round 136 (Rated for Div. 2) 补题题解 (A、B)
    springboot 部署到 weblogic 中 jar 包冲突
    springboot+vue.js+Elementui在线课程管理系统
    计算机网络 | 体系结构
    C#开发的OpenRA游戏之属性QuantizeFacingsFromSequence(7)
    go 命令行工具 cobra
    自然语言处理(NLP)中的迁移学习
    Qt编译MySQL数据库驱动
  • 原文地址:https://blog.csdn.net/weixin_44398687/article/details/136666307