log4cxx类的使用(简单封装)

#pragma once

#include 

class Logcxx : public boost::serialization::singleton
{
public:
	enum Level
	{
		ERROR,
		WARN,
		INFO,
		DEBUG
	};

	class Imp;

public:
	void Init( const char* prop );
	void Print( const char* file, long line, const char* funtion, Level level, const char* format, ... );

protected:
	Logcxx(void);
	~Logcxx(void);

private:
	Imp* _pImp;
};

#define  _LOG(...) Logcxx::get_mutable_instance().Print(__FILE__, __LINE__, __FUNCTION__, __VA_ARGS__)

#include "Logcxx.h"

#include 
#include  
#include 
#include   
#include   
#include   
#include   
#include 

class Logcxx::Imp
{
public:
	Imp()
	{

	}
	~Imp()
	{

	}

	void Init(const char* prop = "log4cxx.properties" )
	{

		setlocale(LC_ALL, "chs");

		log4cxx::PropertyConfigurator::configureAndWatch(prop);  
		
		log4cxx::LoggerPtr rootLogger = log4cxx::Logger::getRootLogger();
		assert(rootLogger);
	}
	void Print(Logcxx::Level level, std::string& buff)
	{
		log4cxx::LoggerPtr rootLogger(log4cxx::Logger::getRootLogger());


		switch(level)
		{
		case Logcxx::ERROR:
			rootLogger->error(buff);
			break;
		case Logcxx::WARN:
			rootLogger->warn(buff);
			break;
		case Logcxx::DEBUG:
			rootLogger->debug(buff);
			break;
		case Logcxx::INFO:
			rootLogger->info(buff);
			break;
		default:
			assert(false);
			rootLogger->info(buff);
			break;
		}
	}
};

Logcxx::Logcxx(void)
{
	_pImp = new Imp();
}


Logcxx::~Logcxx(void)
{
	if (_pImp)
	{
		delete _pImp;
	}
}

void Logcxx::Init( const char* prop )
{
	_pImp->Init(prop);
}

void Logcxx::Print( const char* file, long line, const char* funtion, Level level, const char* format, ... )
{
	char buff[4096];
	va_list ap;
	va_start(ap, format);
	vsnprintf_s(buff, 4096, format, ap);
	va_end(ap);

	std::string strlog = (boost::format(" %s %s %s : %s") %file %line %funtion %buff).str();

	_pImp->Print(level, strlog);
}

调用方式

_LOG(Logcxx::WARN, "%d, %s", a,s);


log4cxx.properties配置

log4j.rootLogger=ERROR,fa,ca


log4j.appender.ca=org.apache.log4j.ConsoleAppender
log4j.appender.ca.layout=org.apache.log4j.PatternLayout
log4j.appender.ca.layout.ConversionPattern=[%d{MM-dd HH:mm:ss}] %-5p %.16c %t %r - %m%n


log4j.appender.fa=org.apache.log4j.FileAppender
log4j.appender.fa.File=./testlog4cxx.log
log4j.appender.fa.Append=true
log4j.appender.fa.layout=org.apache.log4j.PatternLayout
log4j.appender.fa.MaxFileSize=10240KB
log4j.appender.fa.MaxBackupIndex=5
log4j.appender.fa.layout.ConversionPattern=[%d{MM-dd HH:mm:ss}] %-5p %.16c - %m%n


Log4J采用类似C语言中的printf函数的打印格式格式化日志信息,打印参数如下: 
%m 输出代码中指定的消息 
%p 输出优先级,即DEBUG,INFO,WARN,ERROR,FATAL 
%r 输出自应用启动到输出该log信息耗费的毫秒数
%c 输出所属的类目,通常就是所在类的全名
%t 输出产生该日志事件的线程名 
%n 输出一个回车换行符,Windows平台为“rn”,Unix平台为“n”
%d 输出日志时间点的日期或时间,默认格式为ISO8601,也可以在其后指定格式,比如:%d{yyyy MMM dd
HH:mm:ss,SSS},输出类似:2002年10月18日 22:10:28,921 %l 输出日志事件的发生位置,包括类目名
、发生的线程,以及在代码中的行数。

你可能感兴趣的:(C++)