
关于log4cpp的介绍与好处就不再赘言了,百度一搜一大把。log4cpp主要是对于log4cpp的使用如果不封装一下,感觉还是挺麻烦的,例如不少函数名挺长的。log4cpp所以自己动手把它的日常使用进行了封装,可以让使用log4cpp就像调用一句printf()函数一样简单快捷。
不需要用一次就调用一次getInstance,只需要在main文件中引入一次即可
封装成需要使用时只需简短的一举logError(“somelog”) 就搞定
输出的日志内容包含:文件名,函数名,行号(通过以上函数调用即可)
利用单例模式封装

巧妙的使用宏定义可以缩短函数调用形式(虽然effective c++ 和google C++编程规范都极力反对使用太多宏)
#ifndef _MYLOG_H
#define _MYLOG_H
#include<log4cpp/Category.hh>
#include<iostream>
//日志优先级
enum Priority {
ERROR,
WARN,
INFO,
DEBUG
};
//用单例模式封装log4cpp
class Mylog {
public:
static Mylog& getInstance();
static void destory();
void setPriority(Priority priority);
void error(const char* msg);
void warn(const char* msg);
void info(const char* msg);
void debug(const char* msg);
private:
Mylog(); //单例模式:构造函数私有化
private:
static Mylog *plog_;
log4cpp::Category &category_ref_;
};
//*****************************************************
//注意:
//文件名 __FILE__ ,函数名 __func__ ,行号__LINE__ 是编译器实现的
//并非C++头文件中定义的
//前两个变量是string类型,且__LINE__是整形,所以需要转为string类型
//******************************************************
//整数类型文件行号 ->转换为string类型
inline std::string int2string(int line) {
std::ostringstream oss;
oss << line;
return oss.str();
}
//定义一个在日志后添加 文件名 函数名 行号 的宏定义
#define suffix(msg) std::string(msg).append(" ##")\
.append(__FILE__).append(":").append(__func__)\
.append(":").append(int2string(__LINE__))\
.append("##").c_str()
//不用每次使用时写 getInstance语句
//只需要在主函数文件中写: #define _LOG4CPP_即可在整个程序中使用
#ifdef _LOG4CPP_
Mylog &log = Mylog::getInstance();
#else
extern Mylog &log;
#endif
//缩短并简化函数调用形式
#define logError(msg) log.error(suffix(msg))
#define logWarn(msg) log.warn(suffix(msg))
#define logInfo(msg) log.info(suffix(msg))
#define logDebug(msg) log.debug(suffix(msg))
#endif
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/jisuanjixue/article-23398-1.html
一天内所有软件闪退了两次
你的老师也是白教你了
你赚发了