一、log4cpp的使用
1. 下载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__是编译器提供的预处理宏
,它们是在预处理阶段就被替换掉了,如果不封装成宏函数会导致打印的行号等信息不准。
#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);
}
三、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");
}
生成效果: