基于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 <iostream>
#include <log4cpp/Category.hh>
#include <log4cpp/OstreamAppender.hh>
#include <log4cpp/BasicLayout.hh>
#include <log4cpp/Priority.hh>

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;
}

6. 编译代码并运行测试

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

二、自定义封装的MyLogger类

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

#ifndef __MYLOGGER_H__
#define __MYLOGGER_H__
#include <iostream>
#include <log4cpp/FileAppender.hh>
#include <log4cpp/OstreamAppender.hh>
#include <log4cpp/RollingFileAppender.hh>
#include <log4cpp/BasicLayout.hh>
#include <log4cpp/PatternLayout.hh>
#include <log4cpp/Priority.hh>
#include <log4cpp/Category.hh>

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);
}

#endif // __MYLOGGER_H__

三、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();
}

方式二:宏函数

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");
}

生成效果:

在这里插入图片描述

  • 8
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值