#include <iostream>
#include <string>
#include <log4cpp/Category.hh>
#include <log4cpp/PatternLayout.hh>
#include <log4cpp/FileAppender.hh>
#include <log4cpp/OstreamAppender.hh>
#include <log4cpp/Priority.hh>
#include <log4cpp/RollingFileAppender.hh>
using namespace log4cpp;
using std::cout;
using std::endl;
//定义一个在日志后添加 文件名 函数名 行号 的宏定义
//定义为普通函数则只会显示suffix函数和该函数所在行号
//定义为宏函数则会显示调用时的函数
#define suffix(msg) std::string(msg).append(" ")\
.append(__FILE__).append(": ").append(__func__)\
.append(": ").append(std::to_string(__LINE__))\
.append(" ").c_str()
//缩短并简化函数调用形式
#define logEmerg(msg) Mylogger::getInstance()->emerg(suffix(msg))
#define logFatal(msg) Mylogger::getInstance()->fatal(suffix(msg))
#define logCrit(msg) Mylogger::getInstance()->crit(suffix(msg))
#define logAlert(msg) Mylogger::getInstance()->alert(suffix(msg))
#define logError(msg) Mylogger::getInstance()->error(suffix(msg))
#define logWarn(msg) Mylogger::getInstance()->warn(suffix(msg))
#define logInfo(msg) Mylogger::getInstance()->info(suffix(msg))
#define logNotice(msg) Mylogger::getInstance()->notice(suffix(msg))
#define logDebug(msg) Mylogger::getInstance()->debug(suffix(msg))
class Mylogger
{
public:
static Mylogger * getInstance(){
if(nullptr == _pInstance){
_pInstance = new Mylogger;
}
return _pInstance;
}
static void destory(){
if(_pInstance){
delete _pInstance;
_pInstance = nullptr;
}
}
void emerg(const char *msg){
_category.emerg(msg);
}
void fatal(const char *msg){
_category.fatal(msg);
}
void alert(const char *msg){
_category.alert(msg);
}
void crit(const char *msg){
_category.crit(msg);
}
void warn(const char *msg){
_category.warn(msg);
}
void error(const char *msg){
_category.error(msg);
}
void notice(const char *msg){
_category.notice(msg);
}
void info(const char *msg){
_category.info(msg);
}
void debug(const char *msg){
_category.debug(msg);
}
private:
Mylogger()
: _category(Category::getRoot()) {
PatternLayout* ptn = new PatternLayout();
ptn->setConversionPattern("%d %c [%p] %m%n");
OstreamAppender* pos = new OstreamAppender("console",&cout);
pos->setLayout(ptn);
_category.setPriority(Priority::DEBUG);
_category.addAppender(pos);
}
private:
Category & _category;
static Mylogger* _pInstance;
};
Mylogger* Mylogger::_pInstance = nullptr;
void test0()
{
//完成单例模式的写法
Mylogger::getInstance()->info("The log is info message");
Mylogger::getInstance()->error("The log is error message");
Mylogger::getInstance()->fatal("The log is fatal message");
Mylogger::getInstance()->crit("The log is crit message");
Mylogger::destory();
}
void test1()
{
printf("hello,world\n");
//像使用printf一样
logInfo("The log is info message");
logError("The log is error message");
logWarn("The log is warn message");
logDebug("The log is debug message");
Mylogger::destory();
}
int main(){
test0();
test1();
return 0;
}
C++单例模式封装log4cpp
最新推荐文章于 2024-10-07 19:01:55 发布