一个基于log4cplus的简单日志类

无聊,对log4cplus进行了简单的封装,我需要的功能不多,

/*
* /file CloudLog.h
* /brief 一个简单的日志类CloudLog,简单封装log4cplus的功能,线程安全
* /date 2010-2-25
* /author Cloud
*
* 支持Windows和Linux,VS2005和Ubuntu 9.10 gcc 4.4.1测试通过
* Linux下连接需要添加选项-llog4cplus
*
* 使用举例:
* CloudLog:Log("This is test log: %d",100);
*/

#ifndef _CLOUD_LOG_H_
#define _CLOUD_LOG_H_

#include <log4cplus/logger.h>
#include <log4cplus/fileappender.h>
#include <log4cplus/consoleappender.h>
#include <log4cplus/layout.h>
#include <log4cplus/configurator.h>
#include <stdarg.h>
#include <stdlib.h>
#include <memory.h>

using namespace log4cplus;
using namespace log4cplus::helpers;

#ifdef WIN32
#include <windows.h>
#ifndef _DEBUG
#pragma comment(lib,"log4cplusS.lib")
#else
#pragma comment(lib,"log4cplusSD.lib")
#endif
#endif

#ifdef __linux__
#include <pthread.h>
#define __cdecl
#endif

#define DEFAULT_LOG_CONFIGFILE "cloudlog.cfg"

#define CLOUDLOG(level,msg) LOG4CPLUS_##level(Logger::getRoot(),msg)

class CloudMutex
{
public:
CloudMutex()
{
#ifdef WIN32
::InitializeCriticalSection(&m_mutex);
#else
pthread_mutex_init(&m_mutex,0);
#endif
}

~CloudMutex()
{
#ifdef WIN32
::DeleteCriticalSection(&m_mutex);
#else
pthread_mutex_destroy(&m_mutex);
#endif
}

inline void Acquire()
{
#ifdef WIN32
::EnterCriticalSection(&m_mutex);
#else
pthread_mutex_lock(&m_mutex);
#endif
}

inline void Release()
{
#ifdef WIN32
::LeaveCriticalSection(&m_mutex);
#else
pthread_mutex_unlock(&m_mutex);
#endif
}

private:

#ifdef WIN32
CRITICAL_SECTION m_mutex;
#else
pthread_mutex_t m_mutex;
#endif
};

enum{
CLOUD_TRACE,
CLOUD_DEBUG,
CLOUD_INFO,
CLOUD_WARN,
CLOUD_ERROR,
CLOUD_FATAL
};

class CloudLog
{

public:
CloudLog() {}
~CloudLog(){}

//Initialize log system by specified config file
static void Initialize(std::string strConfig)
{
printf("CloudLog::Initialize(%s)/n",strConfig.c_str());
m_mutex.Acquire();
m_strConfig = strConfig;
//Logger::getRoot().shutdown();
PropertyConfigurator::doConfigure(m_strConfig);
m_logger = Logger::getRoot();
m_bInited = true;
m_mutex.Release();
}

static void __cdecl Log(int level,const char* format,...);

private:
static Logger m_logger;
static bool m_bInited;
static std::string m_strConfig;
static CloudMutex m_mutex;
};

bool CloudLog::m_bInited = false;
std::string CloudLog::m_strConfig = DEFAULT_LOG_CONFIGFILE;
CloudMutex CloudLog::m_mutex;
Logger CloudLog::m_logger;


//实现
void CloudLog::Log(int level,const char* format,...)
{
m_mutex.Acquire();

if(m_bInited == false){
printf("Initialize log4cplus system /tConfigFile:%s/n",m_strConfig.c_str());
//Logger::getRoot().shutdown();
PropertyConfigurator::doConfigure(m_strConfig);
m_logger = Logger::getRoot();
m_bInited = true;
}

char buf[4096] = {0};
char *p = buf;
memset(buf,0,4096);
va_list args;
int n;

va_start(args,format);
#ifdef __linux__
n = vsnprintf(p,sizeof buf - 1,format,args);
#else
n = _vsnprintf(p,sizeof buf -1,format,args);
#endif
va_end(args);

std::string strmsg = buf;

if(level == CLOUD_TRACE)
LOG4CPLUS_TRACE(m_logger,strmsg);
else if(level == CLOUD_DEBUG)
LOG4CPLUS_DEBUG(m_logger,strmsg);
else if(level == CLOUD_INFO)
LOG4CPLUS_INFO(m_logger,strmsg);
else if(level == CLOUD_WARN)
LOG4CPLUS_WARN(m_logger,strmsg);
else if(level == CLOUD_ERROR)
LOG4CPLUS_ERROR(m_logger,strmsg);
else if(level == CLOUD_FATAL)
LOG4CPLUS_FATAL(m_logger,strmsg);

m_mutex.Release();
}

#endif

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值