#include "colorlog.h"
#include <memory.h>
#include <stdarg.h>
#include <string.h>
#ifdef WIN32
#include <direct.h>
#include <io.h>
#else
#include <stdarg.h>
#include <sys/stat.h>
#include <unistd.h>
#endif
#ifdef WIN32
#define ACCESS _access
#define MKDIR(a) _mkdir((a))
#else
#define ACCESS access
#define MKDIR(a) mkdir((a), 0755)
#endif
namespace AppParkServer
{
#ifdef WIN32
#define COLORLOG(LABEL) \
memset(mLogMsg, 0, LOG_MESSAGE_LEN); \
\
if(mLogTime) \
{ \
t = time(NULL); \
localtime_s(&local, &t); \
sprintf_s(mLogMsg, LOG_MESSAGE_LEN, "[%s][%04d-%02d-%02d %02d:%02d:%02d]: ", LABEL, \
local.tm_year+1900,local.tm_mon+1, local.tm_mday, \
local.tm_hour,local.tm_min, local.tm_sec); \
nLen = (unsigned int)strlen(mLogMsg); \
} \
\
vsprintf_s(mLogMsg+nLen, LOG_MESSAGE_LEN, format, arglist); \
\
if(mFile) \
{ \
nLen = (unsigned int)strlen(mLogMsg); \
fwrite(mLogMsg, sizeof(char), nLen, mFile); \
fflush(mFile); \
}
#else
#define COLORLOG(LABEL) \
memset(mLogMsg, 0, LOG_MESSAGE_LEN); \
\
if(mLogTime) \
{ \
t = time(NULL); \
local = localtime(&t); \
sprintf(mLogMsg, "[%s][%04d-%02d-%02d %02d:%02d:%02d]: ", LABEL, \
local->tm_year+1900,local->tm_mon+1, local->tm_mday, \
local->tm_hour,local->tm_min, local->tm_sec); \
nLen = (unsigned int)strlen(mLogMsg); \
} \
\
vsprintf(mLogMsg+nLen, format, arglist); \
\
if(mFile) \
{ \
nLen = (unsigned int)strlen(mLogMsg); \
fwrite(mLogMsg, sizeof(char), nLen, mFile); \
fflush(mFile); \
}
#endif
kColorLog::kColorLog()
{
mLogTime = false;
memset(mLogMsg, 0, LOG_MESSAGE_LEN);
memset(mFolderName, 0, LOG_FILE_NAME_LEN);
memset(mFileName, 0, LOG_FILE_NAME_LEN);
mFile = NULL;
}
kColorLog::~kColorLog()
{
Uninit();
}
bool kColorLog::Init(const char* folder, const char* file)
{
#ifdef WIN32
m_hConsole= GetStdHandle(STD_OUTPUT_HANDLE);
if(!m_hConsole){ return false; }
#endif
if(!IsFolderExist(folder))
{
if(!CreateFolder(folder))
{
printf("Create folder \"%s\" failed.", folder);
return false;
}
}
t = time(NULL);
#ifdef WIN32
localtime_s(&local, &t);
sprintf_s(mFileName, LOG_FILE_NAME_LEN, "%s/%s[%04d-%02d-%02d].log",
folder, file,
local.tm_year+1900,local.tm_mon+1, local.tm_mday);
if(0 != fopen_s(&mFile, mFileName, "at"))
#else
local = localtime(&t);
sprintf(mFileName, "%s/%s[%04d-%02d-%02d].log",
folder, file,
local->tm_year+1900,local->tm_mon+1, local->tm_mday);
if(0 == (mFile=fopen(mFileName,"at")))
#endif
{
Fatal("Create log file \"%s\" failed.", mFileName);
return false;
}
return true;
}
void kColorLog::Uninit()
{
#ifdef WIN32
if(m_hConsole){ FreeConsole(); m_hConsole=0; }
#endif
if(NULL != mFile)
{
fclose(mFile);
mFile = NULL;
}
memset(mLogMsg, 0, LOG_MESSAGE_LEN);
memset(mFolderName, 0, LOG_FILE_NAME_LEN);
memset(mFileName, 0, LOG_FILE_NAME_LEN);
}
void kColorLog::SetLogTime(bool val)
{
mLogTime = true;
}
void kColorLog::Debug(const char * format, ...)
{
unsigned int nLen = 0;
va_list arglist = 0;
va_start(arglist, format);
COLORLOG("DEBUG");
ColorLog(FC_DARK_GREEN, FC_BLACK);
va_end(arglist);
}
void kColorLog::Info(const char * format, ...)
{
unsigned int nLen = 0;
va_list arglist = 0;
va_start(arglist, format);
COLORLOG("INFO");
memset(mLogMsg, 0, LOG_MESSAGE_LEN);
printf("%s", mLogMsg);
va_end(arglist);
}
void kColorLog::Warn(const char * format, ...)
{
unsigned int nLen = 0;
va_list arglist = 0;
va_start(arglist, format);
COLORLOG("WARN");
ColorLog(FC_YELLOW, FC_BLACK);
va_end(arglist);
}
void kColorLog::Error(const char * format, ...)
{
unsigned int nLen = 0;
va_list arglist = 0;
va_start(arglist, format);
COLORLOG("ERROR");
ColorLog(FC_MAGENTA, FC_BLACK);
va_end(arglist);
}
void kColorLog::Fatal(const char * format, ...)
{
unsigned int nLen = 0;
va_list arglist = 0;
va_start(arglist, format);
COLORLOG("FATAL");
ColorLog(FC_RED, FC_BLACK);
va_end(arglist);
}
void kColorLog::Log(const char* label, const char* format, ...)
{
unsigned int nLen = 0;
va_list arglist = 0;
va_start(arglist, format);
memset(mLogMsg, 0, LOG_MESSAGE_LEN);
if(mLogTime)
{
t = time(NULL);
#ifdef WIN32
localtime_s(&local, &t);
sprintf_s(mLogMsg, LOG_MESSAGE_LEN, "[%s][%04d-%02d-%02d %02d:%02d:%02d]: ", label?label:"",
local.tm_year+1900,local.tm_mon+1, local.tm_mday,
local.tm_hour,local.tm_min, local.tm_sec);
#else
local = localtime(&t);
sprintf(mLogMsg, "[%s][%04d-%02d-%02d %02d:%02d:%02d]: ", label?label:"",
local->tm_year+1900,local->tm_mon+1, local->tm_mday,
local->tm_hour,local->tm_min, local->tm_sec);
#endif
nLen = (unsigned int)strlen(mLogMsg);
}
#ifdef WIN32
vsprintf_s(mLogMsg+nLen, LOG_MESSAGE_LEN, format, arglist);
#else
vsprintf(mLogMsg+nLen, format, arglist);
#endif
if(mFile)
{
nLen = (unsigned int)strlen(mLogMsg);
fwrite(mLogMsg, sizeof(char), nLen, mFile);
fflush(mFile);
}
printf("%s", mLogMsg);
va_end(arglist);
}
void kColorLog::ColorLog(unsigned int fc, unsigned int bc)
{
#ifdef WIN32
if(!m_hConsole) { return; }
WORD color = fc | bc;
GetConsoleScreenBufferInfo(m_hConsole, (PCONSOLE_SCREEN_BUFFER_INFO)&m_ScreenInfo);
SetConsoleTextAttribute(m_hConsole, color);
printf(mLogMsg);
SetConsoleTextAttribute(m_hConsole, m_ScreenInfo.wAttributes);
#else
printf("\e[%d;%dm", fc, bc);
printf("%s", mLogMsg);
printf("\e[%d;%dm", FC_WHITE, BC_BLACK); // 假设 Linux 默认为 前景白,背景黑
#endif
}
void kColorLog::ColorLog(const char* label, unsigned int fc, unsigned int bc, const char* format, ...)
{
unsigned int nLen = 0;
va_list arglist = 0;
#ifdef WIN32
if(!m_hConsole) { return; }
#endif
va_start(arglist, format);
memset(mLogMsg, 0, LOG_MESSAGE_LEN);
if(mLogTime)
{
t = time(NULL);
#ifdef WIN32
localtime_s(&local, &t);
sprintf_s(mLogMsg, LOG_MESSAGE_LEN, "[%s][%04d-%02d-%02d %02d:%02d:%02d]: ", label?label:"",
local.tm_year+1900,local.tm_mon+1, local.tm_mday,
local.tm_hour,local.tm_min, local.tm_sec);
#else
local = localtime(&t);
sprintf(mLogMsg, "[%s][%04d-%02d-%02d %02d:%02d:%02d]: ", label?label:"",
local->tm_year+1900,local->tm_mon+1, local->tm_mday,
local->tm_hour,local->tm_min, local->tm_sec);
#endif
nLen = (unsigned int)strlen(mLogMsg);
}
#ifdef WIN32
vsprintf_s(mLogMsg+nLen, LOG_MESSAGE_LEN, format, arglist);
#else
vsprintf(mLogMsg+nLen, format, arglist);
#endif
if(mFile)
{
nLen = (unsigned int)strlen(mLogMsg);
fwrite(mLogMsg, sizeof(char), nLen, mFile);
fflush(mFile);
}
#ifdef WIN32
WORD color = fc | bc;
GetConsoleScreenBufferInfo(m_hConsole, (PCONSOLE_SCREEN_BUFFER_INFO)&m_ScreenInfo);
SetConsoleTextAttribute(m_hConsole, color);
printf(mLogMsg);
SetConsoleTextAttribute(m_hConsole, m_ScreenInfo.wAttributes);
#else
printf("\e[%d;%dm", fc, bc);
printf("%s", mLogMsg);
printf("\e[%d;%dm", FC_WHITE, BC_BLACK); // 假设 Linux 默认为 前景白,背景黑
#endif
va_end(arglist);
}
void kColorLog::Sample()
{
#ifdef WIN32
if(!m_hConsole) { return; }
#endif
Log("Tom", "##########\n");
Debug("##########\n");
Info("##########\n");
Warn("##########\n");
Error("##########\n");
Fatal("##########\n");
ColorLog("", FC_BLACK, BC_WHITE, "%-20s ##########\n", "FC_BLACK");
ColorLog("", FC_DARK_BLUE, BC_DARK_GRAY, "%-20s ##########\n", "FC_DARK_BLUE");
ColorLog("", FC_DARK_GREEN, BC_BLACK, "%-20s ##########\n", "FC_DARK_GREEN");
ColorLog("", FC_DARK_CRAY, BC_BLACK, "%-20s ##########\n", "FC_DARK_CRAY");
ColorLog("", FC_DARK_RED, BC_BLACK, "%-20s ##########\n", "FC_DARK_RED");
ColorLog("", FC_DARK_MAGENTA, BC_BLACK, "%-20s ##########\n", "FC_DARK_MAGENTA");
ColorLog("", FC_DARK_YELLOW, BC_BLACK, "%-20s ##########\n", "FC_DARK_YELLOW");
ColorLog("", FC_GRAY, BC_BLACK, "%-20s ##########\n", "FC_GRAY");
ColorLog("", FC_DARK_GRAY, BC_BLACK, "%-20s ##########\n", "FC_DARK_GRAY");
ColorLog("", FC_BLUE, BC_BLACK, "%-20s ##########\n", "FC_BLUE");
ColorLog("", FC_GREEN, BC_BLACK, "%-20s ##########\n", "FC_GREEN");
ColorLog("", FC_CRAY, BC_BLACK, "%-20s ##########\n", "FC_CRAY");
ColorLog("", FC_RED, BC_BLACK, "%-20s ##########\n", "FC_RED");
ColorLog("", FC_MAGENTA, BC_BLACK, "%-20s ##########\n", "FC_MAGENTA");
ColorLog("", FC_YELLOW, BC_BLACK, "%-20s ##########\n", "FC_YELLOW");
ColorLog("", FC_WHITE, BC_BLACK, "%-20s ##########\n", "FC_WHITE");
// ================================================================================
ColorLog("", FC_WHITE, BC_BLACK, "%-20s ##########\n", "BC_BLACK");
ColorLog("", FC_WHITE, BC_DARK_BLUE, "%-20s ##########\n", "BC_DARK_BLUE");
ColorLog("", FC_WHITE, BC_DARK_GREEN, "%-20s ##########\n", "BC_DARK_GREEN");
ColorLog("", FC_WHITE, BC_DARK_CRAY, "%-20s ##########\n", "BC_DARK_CRAY");
ColorLog("", FC_WHITE, BC_DARK_RED, "%-20s ##########\n", "BC_DARK_RED");
ColorLog("", FC_WHITE, BC_DARK_MAGENTA, "%-20s ##########\n", "BC_DARK_MAGENTA");
ColorLog("", FC_WHITE, BC_DARK_YELLOW, "%-20s ##########\n", "BC_DARK_YELLOW");
ColorLog("", FC_WHITE, BC_GRAY, "%-20s ##########\n", "BC_GRAY");
ColorLog("", FC_WHITE, BC_DARK_GRAY, "%-20s ##########\n", "BC_DARK_GRAY");
ColorLog("", FC_WHITE, BC_BLUE, "%-20s ##########\n", "BC_BLUE");
ColorLog("", FC_WHITE, BC_GREEN, "%-20s ##########\n", "BC_GREEN");
ColorLog("", FC_WHITE, BC_CRAY, "%-20s ##########\n", "BC_CRAY");
ColorLog("", FC_WHITE, BC_RED, "%-20s ##########\n", "BC_RED");
ColorLog("", FC_WHITE, BC_MAGENTA, "%-20s ##########\n", "BC_MAGENTA");
ColorLog("", FC_DARK_GRAY, BC_YELLOW, "%-20s ##########\n", "BC_YELLOW");
ColorLog("", FC_BLACK, BC_WHITE, "%-20s ##########\n", "BC_WHITE");
}
bool kColorLog::IsFolderExist(const char* path)
{
if(0 != ACCESS(path,0)) return false;
return true;
}
bool kColorLog::CreateFolder(const char* path)
{
if(0 != MKDIR(path)) return false;
return true;
}
};