简单易用的C++日志类

#pragma once

#include "SDKDefine.h"
#include "AX_Mutex.h"

//////////////////////////////////////////////////////////////////////////
enum LogLevel
{
LogLevel_All,
LogLevel_Debug,
LogLevel_Info,
LogLevel_Warn,
LogLevel_Error,
LogLevel_Fatal,
LogLevel_Off
};

extern char* strLogLevel[];

class Logger
{
DECLARE_SINGLETON(Logger);
public:
void SetMinLevel(LogLevel minLevel);
LogLevel GetMinLevel() const;

void SetLogInfo(LogLevel level, char* file, int line);

virtual void WriteLog(const char* format, ...);

private:
Logger();

LogLevel m_minLevel;//日志级别开关, 表示高于此级别的日志才允许被记录
//临时信息
char*    m_file;
int      m_line;
LogLevel m_level;
AX_Mutex m_mutex;
};

//////////////////////////////////////////////////////////////////////////
#define LOG_SET_LEVEL(minLevel) Logger::Instance()->SetMinLevel(minLevel)
#define LOG_GET_LEVEL           Logger::Instance()->GetMinLevel()
#define LOG_RELEASE             Logger::Release()

#define LOG_DEBUG Logger::Instance()->SetLogInfo(LogLevel_Debug, __FILE__, __LINE__); Logger::Instance()->WriteLog
#define LOG_INFO Logger::Instance()->SetLogInfo(LogLevel_Info, __FILE__, __LINE__); Logger::Instance()->WriteLog
#define LOG_WARN Logger::Instance()->SetLogInfo(LogLevel_Warn, __FILE__, __LINE__); Logger::Instance()->WriteLog
#define LOG_ERROR Logger::Instance()->SetLogInfo(LogLevel_Error, __FILE__, __LINE__); Logger::Instance()->WriteLog
#define LOG_FATAL Logger::Instance()->SetLogInfo(LogLevel_Fatal, __FILE__, __LINE__); Logger::Instance()->WriteLog

/////////////////////////////////////////////////////////

//cpp

#include "Logger.h"
#include <stdio.h>
#include <time.h>
#include <stdarg.h>

char* strLogLevel[] =
{
"All",
"Debug",
"Info",
"Warn",
"Error",
"Fatal",
"Off"
};

IMPLEMENT_SINGLETON(Logger);

Logger::Logger() : m_minLevel(LogLevel_All)
{

}

void Logger::SetMinLevel( LogLevel minLevel )
{
m_minLevel = minLevel;
}

LogLevel Logger::GetMinLevel() const
{
return m_minLevel;
}


void Logger::SetLogInfo( LogLevel level, char* file, int line )
{
m_mutex.acquire();
m_level = level;
m_file = file;
m_line = line;
}

void Logger::WriteLog( const char* format, ... )
{
if (m_level >= m_minLevel)
{
   fprintf(stderr, "\n==================Log Begin====================\n");

   char str[30];
   time_t now = time(NULL);
   struct tm datetime = {0};  
   localtime_s(&datetime, &now);
   _snprintf_s(str, 30, 30, "%d-%02d-%02d %02d:%02d:%02d",datetime.tm_year+1900,datetime.tm_mon+1,datetime.tm_mday,datetime.tm_hour,datetime.tm_min,datetime.tm_sec);

   fprintf(stderr, "%s %d \n%s [%s]\n", m_file, m_line, str, strLogLevel[m_level]);

   va_list argp;
   va_start(argp, format);
   vfprintf (stderr, format, argp);
   va_end(argp);
   fprintf(stderr, "\n------------------Log End----------------------\n");
}
m_mutex.release();
}


类别:c++ 查看评论

posted on 2010-09-03 08:28  joeguo  阅读(1180)  评论(2)    收藏  举报

导航