#pragma once
#include <boost/serialization/singleton.hpp>
class Logcxx : public boost::serialization::singleton<Logcxx>
{
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 <stdarg.h>
#include <boost/serialization/singleton.hpp>
#include <boost/format.hpp>
#include <log4cxx/logger.h>
#include <log4cxx/basicconfigurator.h>
#include <log4cxx/propertyconfigurator.h>
#include <log4cxx/helpers/exception.h>
#include <string>
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);
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 输出日志事件的发生位置,包括类目名
、发生的线程,以及在代码中的行数。